2012-07-10 11 views
5

Czy istnieje sposób na łączenie grup i * funkcji wyrażeń regularnych, aby działały tak jak tokenizer/splitter. Próbowałem to:Czy grupy Regex i * karty wieloznaczne mogą współpracować ze sobą?

my_str = "foofoofoofoo" 
pattern = "(foo)*" 
result = re.search(pattern, my_str) 

ja liczyłem moje grupy może wyglądać

("foo", "foo", "foo", "foo") 

Ale tak nie jest. Byłem tym zaskoczony, ponieważ? Funkcje grupowe działają razem:

my_str= "Mr foo" 
pattern = "(Mr)? foo" 
result = re.search(pattern, my_str) 
+3

wątpię, że będzie działać, ale można dostać to, co chcesz za pomocą 're.findall (" foo "," foofoofoofoo ")". Aha, i proszę nie używać 'str' jako nazwy zmiennej. –

+0

Zmieniłem 'str' na' my_str', ponieważ 'str' cienie są wbudowane. – jamylak

+0

ha, tak, przepraszam, str był tylko przykładem. Ten kod prawdopodobnie nie jest poprawny pod względem składniowym. Ponadto widziałem metodę findall i to zdecydowanie by działało. Byłem po prostu ciekawy w bardziej ogólnym sensie. –

Odpowiedz

4

Problem to Powtarzasz swoją jedyną grupę przechwytywania. Oznacza to, że masz tylko jeden nawias ==> jedna grupa przechwytująca, a ta grupa przechwytywania jest zastępowana za każdym razem, gdy pasuje.

Aby uzyskać więcej informacji, należy odwiedzić stronę regular-expression na stronie Repeating a Capturing Group vs. Capturing a Repeated Group. (Ale przechwytywanie powtórzonej grupy także nie jest tym, czego potrzebujesz)

Po wykonaniu polecenia regularne przechwytywanie grupy 1 będzie zawierało ostatnio znaleziony element "foo".

To byłoby nie daje oczekiwanego rezultatu:

my_str = "foofoofoofoo" 
pattern = "foo" 
result = re.findall(pattern, my_str) 

wynik jest wtedy lista ['foo', 'foo', 'foo', 'foo']

+0

+1 za bardzo pomocne łącze. Dziękuję Ci! –

+0

interesujące. Dzięki. –

3

Grupy przechwytujące i * nie działają z wbudowanym modułem re - zamiast tego użyj findall.

Istnieje biblioteka o nazwie regex w pypi, która, jak sądzę, obsługuje tę składnię i ma kilka innych funkcji, takich jak śledzenie zmiennej długości wstecznej.

+0

To by wyjaśniało rzeczy. Dzięki. –

Powiązane problemy