>>> match = re.findall('a.*?a', 'a 1 a 2 a 3 a 4 a')
>>> match
['a 1 a', 'a 3 a']
Jak mogę zmusić go do wydrukowaniaPython re.findall wydrukować wszystkie wzory
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
Dziękujemy!
>>> match = re.findall('a.*?a', 'a 1 a 2 a 3 a 4 a')
>>> match
['a 1 a', 'a 3 a']
Jak mogę zmusić go do wydrukowaniaPython re.findall wydrukować wszystkie wzory
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
Dziękujemy!
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.
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.
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']
Będzie miło, jeśli/kiedy ten moduł kiedykolwiek zastępuje domyślną 'moduł re' –
@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
również go szukał i nigdy nie wiedział, że moduł "regex" jest lepszy niż "re" –
jest to sposób, aby to zrobić +1 –