Próbuję znaleźć każdą 10-cyfrową serię liczb w większej serii liczb, używając funkcji re w Pythonie 2.6.
Z łatwością mogę złapać żadne nakładające się mecze, ale chcę, aby każdy mecz w serii liczbowej. Na przykład.
w „123456789123456789”
Powinienem otrzymać następującą listę:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Znalazłem odniesienia do „lookahead”, ale przykłady, które widziałem, pokazują tylko pary liczb, a nie większe grupy i nie byłem w stanie przekonwertować ich poza dwie cyfry.
python
regex
overlapping
danspants
źródło
źródło
(a|ab|abc)
mogą być generalnie przepisane jako nienakładające się z zagnieżdżonymi grupami przechwytywania, np.(a(b(c)?)?)?
Gdy ignorujemy wszystkie oprócz skrajnej (tj. Lewej) grupy przechwytywania podczas rozpakowywania dopasowania; co prawda jest to trochę bolesne i mniej czytelne. Będzie to również bardziej wydajne wyrażenie regularne.Odpowiedzi:
Użyj grupy przechwytywania wewnątrz lookahead. Lookahead przechwytuje tekst, który Cię interesuje, ale rzeczywiste dopasowanie jest technicznie podciągiem o zerowej szerokości przed lookahead, więc dopasowania technicznie się nie pokrywają:
import re s = "123456789123456789" matches = re.finditer(r'(?=(\d{10}))',s) results = [int(match.group(1)) for match in matches] # results: # [1234567891, # 2345678912, # 3456789123, # 4567891234, # 5678912345, # 6789123456, # 7891234567, # 8912345678, # 9123456789]
źródło
Możesz także spróbować użyć modułu innej firmy
regex
(niere
), który obsługuje nakładające się dopasowania.>>> import regex as re >>> s = "123456789123456789" >>> matches = re.findall(r'\d{10}', s, overlapped=True) >>> for match in matches: print(match) # print match ... 1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789
źródło
TypeError: findall() got an unexpected keyword argument 'overlapped'
regex
moduł:pip install regex
Lubię wyrażenia regularne, ale nie są one tutaj potrzebne.
Po prostu
s = "123456789123456789" n = 10 li = [ s[i:i+n] for i in xrange(len(s)-n+1) ] print '\n'.join(li)
wynik
1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789
źródło
0 <= i < len(s)-n+1
na pewno będzie początkiem 10-cyfrowego dopasowania. Wydaje mi się również, że twój kod można przyspieszyć, byłoby interesujące kodowanie golfa dla szybkości.