повторяя регулярные выражения нескольких символов - PullRequest
19 голосов
/ 03 сентября 2010

Есть ли способ использовать регулярное выражение для сопоставления повторяющегося набора символов?Например:

ABCABCABCABCABC

ABC{5}

Я знаю, что это неправильно.Но есть ли что-нибудь, чтобы соответствовать этому эффекту?

Обновление:

Можете ли вы использовать вложенные группы захвата?Так что-то вроде (?<cap>(ABC){5})?

Ответы [ 5 ]

38 голосов
/ 03 сентября 2010

Заключите в скобки регулярное выражение, которое вы хотите повторить.Например, если вам нужно 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'
3 голосов
/ 03 сентября 2010

ABC {5} соответствует ABCCCCC.Чтобы соответствовать 5 ABC, вы должны использовать (ABC) {5}.Круглые скобки используются для группировки набора символов.Вы также можете установить интервал для вхождений, таких как (ABC) {3,5}, который соответствует ABCABCABC, ABCABCABCABC и ABCABCABCABCABC.

(ABC) {1,} означает 1 или более повторений, что в точности соответствует (ABC) +.

(ABC) {0,} означает 0 или более повторений, что точнотак же, как (ABC) *.

3 голосов
/ 03 сентября 2010

(ABC){5} Должно работать на вас

1 голос
/ 03 сентября 2010

Круглые скобки «()» используются для группировки символов и выражений в более крупных и сложных регулярных выражениях.Квантификаторы, которые следуют непосредственно за группой, применяются ко всей группе.

(ABC){5}
0 голосов
/ 03 сентября 2010

Что касается обновления вопроса -

Вы можете вкладывать группы захвата.Индекс группы захвата увеличивается для каждой открытой пары.

(((ABC)*)(DEF)*)

Подача этого регулярного выражения ABCABCABCDEFDEFDEF, группа захвата 0 соответствует целому, 1 также является целым, 2 - ABCABCABC, 3 - ABC, 4 -DEF (поскольку звезда находится за пределами группы захвата).

Если у вас есть вариация внутри группы захвата и повторение только снаружи, то все может стать немного шатким, если вы этого не ожидаете ...

(a[bc]*c)*

при подаче abbbcccabbc вернет совпадение last в качестве группы захвата 1, в данном примере только abbc, поскольку группа захвата сбрасывается с помощью оператора повтора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...