2013-07-04 16 views

Odpowiedz

6

myślę stosując pozytywny uprzedzoną twierdzenie powinno załatwić sprawę:

>>> re.findall('(?=(a.*?a))', 'a 1 a 2 a 3 a 4 a') 
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 

re.findall zwraca wszystkie grupy w regex - również te w przeglądowej aheads. Działa to, ponieważ asercja z wyprzedzeniem nie zużywa żadnego ciągu.

+0

jest to sposób, aby to zrobić +1 –

4
r = re.compile('a.*?a') # as we use it multiple times 
matches = [r.match(s[i:]) for i in range(len(s))] # all matches, if found or not 
matches = [m.group(0) for m in matches if m] # matching string if match is not None 
print matches 

daje

['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 

ja nie wiem, czy to jest najlepsze rozwiązanie, ale tutaj przetestować każdy podciąg dotarcia do końca łańcucha dla dopasowania do danego wzorca.

5

Można użyć alternatywnego modułu regex który pozwala nakładające się mecze:

>>> regex.findall('a.*?a', 'a 1 a 2 a 3 a 4 a', overlapped = True) 
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 
+1

Będzie miło, jeśli/kiedy ten moduł kiedykolwiek zastępuje domyślną 'moduł re' –

+0

@JonClements Tak! Kochałbym to. Do wszystkich korzyści, jakie oferuje ten moduł, jest również dobrze obsługiwany. Znalazłem błąd i zgłosiłem to deweloperowi modułów. Zostało to naprawione w ciągu 24 godzin. – ovgolovin

+0

również go szukał i nigdy nie wiedział, że moduł "regex" jest lepszy niż "re" –