2011-11-08 9 views
5

mam analizowania dziennika z pytona i trzeba szybko sprowadzić pewne wartości z niegostwardnienie mecze grupowe dla pojedynczego regex

to prostego równoważne regex i użytkowania Przykład

pat = re.compile("(1(2[3456]+2)+1)*") 

nie działa zgodnie z oczekiwaniami, tylko ostatnia grupa dopasowania jest zwracana przez pat.match(). groups()

Jakie jest najprostsze rozwiązanie takich problemów?

aktualizowane (jak silnik wiki mówi używać zmienił zamiast tworzyć nowy post):

muszę powtarzające mecze, oczywiście.

to_match="1232112542254211232112322421" 

regex find należy zastosować dwukrotnie rekurencyjnie. Mogę to znieść, ale czy są jakieś opcje?

+1

Zmień '*' na '?'. '" (1 (2 [3456] +2) +1)? " –

+0

możliwy duplikat [Python regex multiple groups] (http://stackoverflow.com/questions/4963691/), [Wykonywanie grupowych wyrażeń regularnych z wieloma mecze] (http://stackoverflow.com/questions/5598340/), [Python regexes: Jak uzyskać dostęp do wielu dopasowań grupy?] (http://stackoverflow.com/questions/5060659/). – outis

Odpowiedz

1

Ok, spróbuj tego (ale dopiero po nauczył się akceptować odpowiedzi; -))

s = "123321124421125521" 
pat = re.compile("(1(2[3456]+2)+1)") 
print pat.findall(s) 

usuń kwantyfikator i użyj zamiast niego findall(). Doprowadzi to do tej listy:

[('123321', '2332'), ('124421', '2442'), ('125521', '2552')]

1

Powtarzasz przechwyconą grupę zamiast przechwytywać powtarzającą się grupę i to jest powód, dla którego dostajesz tylko ostatnie przechwycenie.

należy używać

pat = re.compile("((1(2[3456]+2)+1)*)") 

Zobacz tutaj więcej na powtórzenie przechwycony grupę vs przechwytywanie powtarzającego grupę http://www.regular-expressions.info/captureall.html

+2

Nie ma sensu umieszczać nawiasów wokół całego wzoru. Dopasowanie całego wzorca jest już zapisane w '.group (0)'. W twoim rozwiązaniu '.group (0)' i '.group (1)' są takie same. – stema

+0

@stema Masz rację, ale najwyraźniej OP patrzy na 'group (1)' z tego, co mówi w pytaniu. Istnieje również możliwość, że podane tu wyrażenie jest tylko częścią rzeczywistego wyrażenia regularnego, które powoduje OP, problem i może być coś po lewej/prawej stronie danego wyrażenia regularnego, w którym to przypadku 'grupa (0)' może nie być co jest potrzebne. –