Повторение нескольких символов regex
Есть ли способ использовать регулярное выражение для соответствия повторяющемуся набору символов? Например:
ABCABCABCABCABC
ABC{5}
Я знаю это неправильно. Но есть ли что-нибудь, что могло бы соответствовать этому эффекту?
Update:
Можете ли вы использовать вложенные группы захвата? Так что-то вроде (?<cap>(ABC){5})
?
Ответы
Ответ 1
Закрепите регулярное выражение, которое вы хотите повторить в круглых скобках. Например, если вы хотите 5 повторений ABC
:
(ABC){5}
Или, если вы хотите любое количество повторений (0 или больше):
(ABC)*
Или одно или несколько повторений:
(ABC)+
изменить, чтобы отвечать на обновления
Скобки в регулярных выражениях делают две вещи; они группируют последовательность элементов в регулярном выражении, так что вы можете применить оператор к целой последовательности, а не только к последнему элементу, и они захватывают содержимое этой группы, чтобы вы могли извлечь подстроку, которая была сопоставлена этим подвыражением в регулярном выражении.
Вы можете заключать круглые скобки; они подсчитываются с первого вскрытия. Например:
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(0)
'123 ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(1)
'ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(2)
'DEF'
Если вы хотите избежать захвата при группировке, вы можете использовать (?:
. Это может быть полезно, если вы не хотите, чтобы скобки, которые вы просто используете, группировали последовательность с целью применения оператора для изменения нумерации ваших совпадений. Это также быстрее.
>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1)
'DEF'
Итак, чтобы ответить на ваше обновление, да, вы можете использовать вложенные группы захвата или даже избегать захвата внутренней группой:
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1)
'ABCABCABCABCABC'
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2)
'DEF'
Ответ 2
(ABC){5}
Должен работать для вас
Ответ 3
ABC {5} соответствует ABCCCCC. Чтобы соответствовать 5 ABC, вы должны использовать (ABC) {5}. Круглые скобки используются для группировки набора символов. Вы также можете установить интервал для таких случаев, как (ABC) {3,5}, который соответствует ABCABCABC, ABCABCABCABC и ABCABCABCABCABC.
(ABC) {1,} означает 1 или более повторение, которое точно совпадает с (ABC) +.
(ABC) {0,} означает 0 или более повторение, которое точно совпадает с (ABC) *.
Ответ 4
Круглые скобки "()" используются для группировки символов и выражений в более сложных, более сложных регулярных выражениях. Квантеры, которые сразу же следуют за группой, относятся ко всей группе.
(ABC){5}
Ответ 5
Что касается обновления вопроса -
Вы можете группировать группы захвата. Индекс группы захвата увеличивается на каждый открытый пар.
(((ABC)*)(DEF)*)
Подача этого регулярного выражения ABCABCABCDEFDEFDEF, группа захвата 0 соответствует всему, 1 также является целым, 2 - ABCABCABC, 3 - ABC, а 4 - DEF (потому что звезда находится вне группы захвата).
Если у вас есть вариации внутри группы захвата и повторение только снаружи, тогда все может немного поработать, если вы этого не ожидаете...
(a[bc]*c)*
при подаче abbbcccabbc вернет последнее совпадение в качестве группы захвата 1, в этом примере просто аббит, так как группа захвата получает reset с оператором повтора.