2010-09-02 10 views
14

Czy istnieje sposób użycia wyrażenia regularnego do dopasowania powtarzającego się zestawu znaków? Na przykład:Powtarzanie wielu znaków regex

ABCABCABCABCABC

ABC{5}

Wiem, że to źle. Ale czy jest coś, co pasowałoby do tego efektu?

Aktualizacja:

Czy można użyć zagnieżdżonych grup przechwytywania? Coś jak (?<cap>(ABC){5})?

Odpowiedz

34

Powiększyć wyrażenie, które chcesz powtórzyć w nawiasach. Na przykład, jeśli chcesz 5 powtórzeń ABC:

(ABC){5} 

Albo jeśli chcesz dowolną liczbę powtórzeń (0 lub więcej):

(ABC)* 

lub jeden lub więcej powtórzeń:

(ABC)+ 

edytuj aby odpowiedzieć na aktualizację

Nawiasy w wyrażeniach regularnych robią dwie rzeczy; grupują sekwencję elementów w wyrażeniu regularnym, dzięki czemu można zastosować operator do całej sekwencji, a nie tylko do ostatniego elementu, i przechwytują zawartość tej grupy, aby wyodrębnić podciąg dopasowany przez to podwyrażenie w wyrażeniu regularnym.

Można zagnieżdżać nawiasy; są liczone od pierwszego otwarcia. Na przykład:

>>> 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' 

Jeśli chcesz uniknąć przechwytywania podczas grupowania, można użyć (?:. Może to być pomocne, jeśli nie chcesz nawiasów, które są używane do grupowania sekwencji w celu zastosowania operatora, aby zmienić numerację swoich dopasowań. Jest także szybszy.

>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1) 
'DEF' 

Tak aby odpowiedzieć na aktualizację, tak, można używać zagnieżdżonych grup przechwytywania, lub nawet uniknąć robienia z wewnętrzną grupy na wszystkich:

>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1) 
'ABCABCABCABCABC' 
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2) 
'DEF' 
+2

Użyłbym tutaj + zamiast *, ponieważ * będzie pasowało do 0 wystąpień (ABC). – Robusto

+4

(ABC) {3,5} również dla szeregu powtórzeń –

+0

Oh duh. Myślałem() z jakiegoś powodu jest używany tylko do tego uchwycenia. Ale to ma sens. Wybrany jako pierwszy – Falmarri

3

(ABC){5} powinien pracować dla Ciebie

1

nawiasach "()" służą do grupowania znaków i wyrażeń w ramach większych, bardziej złożonych wyrażeń regularnych. Kwantyfikatory bezpośrednio następujące po grupie odnoszą się do całej grupy.

(ABC){5} 
3

ABC {5} pasuje do ABCCCCC. Aby dopasować 5 ABC, powinieneś użyć (ABC) {5}. Nawiasy służą do grupowania zestawu znaków. Można również ustawić interwał dla wystąpień takich jak (ABC) {3,5}, które pasuje do ABCABCABC, ABCABCABCABC i ABCABCABCABCABC.

(ABC) {1,} oznacza jedno lub więcej powtórzeń, które są dokładnie takie same jak (ABC) +.

(ABC) {0,} oznacza 0 lub więcej powtórzeń, które są dokładnie takie same jak (ABC) *.

0

Jeśli chodzi o aktualizację pytania -

Można zagnieździć grupy przechwytywania. Indeks grupy przechwytywania jest zwiększany dla każdego otwartego pliku.

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

Karmienie że regex ABCABCABCDEFDEFDEF, grupa przechwytywania 0 meczu cała sprawa, 1 jest również cała sprawa, 2 ABCABCABC, 3 ABC, a 4 jest DEF (bo gwiazda jest poza grupą przechwytywania) .

Jeśli masz zmienność wewnątrz grupy przechwytywania i powtórzenia na obrzeżach, a następnie rzeczy może być trochę słaby jeśli nie spodziewałem się ...

(a[bc]*c)* 

gdy karmione abbbcccabbc zwróci ostatni Dopasuj jako grupę przechwytywania 1, w tym przykładzie tylko abbc, ponieważ grupa przechwytywania jest resetowana za pomocą operatora powtarzania.