Я ищу regex
шаблон, который будет соответствовать третьему, четвертому, ... вхождению каждого персонажа. Посмотрите ниже для уточнения:
Например, у меня есть следующая строка:
111aabbccxccybbzaa1
Я хочу заменить все дублированные символы после второго вхождения. Выход будет:
11-aabbccx--y--z---
Некоторые шаблоны регулярных выражений, которые я пробовал до сих пор:
Используя следующее регулярное выражение, я могу найти последнее вхождение каждого символа: (.)(?=.*\1)
Или используя этот, я могу сделать это для последовательных дубликатов, но не для любых дубликатов: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
регулярным выражением. Demo .(.)(?<=(.*\1){3})
?(.)(?<=(?:.*\1){3})
мы тоже сделаем эту работу, но все это не очень хорошо, так как чрезмерный возврат может вызвать проблемы с более длинными строками. Я бы предпочел написать метод без регулярных выражений, чтобы решить эту проблему.(.)(?<=(?:.*\1){3})
25 мс,(.)(?<=(?:\1.*?){2}\1)
3 мс. Вы можете просто проверить себя. Ваш, кажется, наименее эффективный шаблон, и его труднее читать.Ответы:
Нерегулярное R решение. Разделить строку. Заменить элементы этого вектора, имеющие rowid> = 3 *, на
'-'
. Вставьте его обратно вместе.*
rowid(x)
- целочисленный вектор, каждый элемент которого представляет количество раз, когда значение из соответствующего элементаx
было реализовано. Так что, если последний элементx
является1
, и это в четвертый раз1
произошло вx
последний элементrowid(x)
является4
.источник
Вы можете легко сделать это без регулярных выражений:
Смотрите код в использовании здесь
Результат:
Как это работает:
for u in set(s)
получает список уникальных символов в строке:{'c','a','b','y','1','z','x'}
for i in ...
перебирает индексы, которые мы собираем в 3.[i for i in range(len(s)) if s[i]==u][2:]
перебирает каждый символ в строке и проверяет, совпадает ли онu
(с шага 1.), затем разделяет массив от 2-го элемента до конца (удаляя первые два элемента, если они существуют)s[:i]+'-'+s[i+1:]
- конкатенировать подстроку до индекса с,-
а затем подстроку после индекса, фактически пропуская исходный символ.источник
Вариант с
gsubfn
данные
источник
Нет регулярных выражений Python, одна строка:
Это перечисляет через строку, считая вхождения текущего символа позади него и только помещая символ, если это один из первых 2, иначе черточка.
источник
Еще один способ сделать это с
pandas
.Выход :
источник
Спасибо Виктору Стрибьеву , Стефану Похманну и Боббл-пузырю . Ради завершения я выкладываю возможно
regex
решения, обсуждаемые в комментариях;Это возможно только с регулярным выражением, которое поддерживает бесконечную ширину. Используя модуль регулярных выражений Python PyPi, мы можем сделать следующее:
Отрывок .
источник