różne zachowania między re.finditer i re.findall
otrzymuję ten przykład z operacji wyrażeń regularnych w Pythonie 2.* Dokumentacja i ten przykład dobrze opisany tutaj w szczegółach z pewnymi modyfikacjami. Aby wyjaśnić cały przykład, uzyskajmy wywołanie zmiennej typu string,
text = "He was carefully disguised but captured quickly by police."
oraz wzorzec wyrażenia regularnego typu compile jako,
regEX = r"\w+ly"pattern = re.compile(regEX)
\w
mean dopasowuje dowolny znak słowa (alfanumeryczny & podkreślenie), +
mean dopasowuje 1 lub więcej z poprzedniego tokenu, a całe znaczenie jest zaznaczeniem dowolnego słowa, które kończy się ly
. Istnieją tylko dwa 2 słowa („ostrożnie” i „szybko”), które są spełnione powyższe Wyrażenie regularne.
przed przejściem do re.findall () lub re.finditer(), zobaczmy co robi re.search () oznacza w Pythonie 2.* Dokumentacja.
przeszukiwanie ciągu znaków w poszukiwaniu pierwszej lokalizacji, w której wzorzec wyrażenia regularnego tworzy dopasowanie i zwraca odpowiednią instancję MatchObject. Zwraca None, jeśli żadna pozycja w łańcuchu nie pasuje do wzorca; zauważ, że różni się to od znalezienia dopasowania o zerowej długości w pewnym punkcie łańcucha.
następujące linie kodu dają podstawowe zrozumienie re.search().
search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>
wygeneruje re.MatchObject obiektu typu class, który ma 13 wspieranych metod i atrybutów zgodnie z Pythonem 2.* Dokumentacja. Ta metoda span() składa się z punktów początkowych i końcowych(7 i 16 obecnych w powyższym przykładzie) dopasowanego słowa W Zmiennej text
. re.metoda search () bierze pod uwagę tylko pierwsze dopasowanie, w przeciwnym razie zwraca None
.
przejdźmy do pytania, zanim zobaczymy, co robi re.finditer () oznacza w Pythonie 2.* Dokumentacja.
zwraca iterator generujący instancje MatchObject nad wszystkimi Nie nakładającymi się dopasowaniami dla wzorca RE w łańcuchu. Łańcuch jest skanowany od lewej do prawej, a dopasowania są zwracane w znalezionej kolejności. Puste mecze są uwzględniane w wyniku.
następne linie kodu dają podstawowe zrozumienie re.finditer().
finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>
powyższy przykład daje nam Obiekty iteratora, które muszą być pętlą. Oczywiście nie tego chcemy. Zapętlmy finditer
i zobaczmy, co jest wewnątrz tego iteratora.
for anObject in finditer: print(anObject) print(type(anObject)) print()#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'><re.Match object; span=(40, 47), match='quickly'><class 're.Match'>
wyniki te są bardzo podobne do re.wynik wyszukiwania (), który otrzymujemy wcześniej. Ale możemy zobaczyć nowy wynik w powyższym wyjściu, <re.Match object; span=(40, 47), match='quickly'>
. Jak wspomniałem wcześniej w Pythonie 2.* Dokumentacja, re.search() przeskanuje string szukając pierwszego miejsca, w którym wzorzec wyrażenia regularnego tworzy dopasowanie i re.finditer() przeskanuje string w poszukiwaniu wszystkich miejsc, w których wzorzec wyrażenia regularnego wytwarza dopasowania i zwróci więcej szczegółów niż re.metoda findall ().
tutaj co robi re.findall () oznacza w Pythonie 2.* Dokumentacja.
zwraca wszystkie Nie nakładające się dopasowania wzorca w łańcuchu, jako listę łańcuchów. Łańcuch jest skanowany od lewej do prawej, a dopasowania są zwracane w znalezionej kolejności. Jeśli we wzorze znajduje się jedna lub więcej grup, zwróć listę grup; będzie to lista krotek, jeśli wzorzec ma więcej niż jedną grupę. Puste mecze są uwzględniane w wyniku.
zrozummy, co się dzieje w re.findall().
findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>
to wyjście daje nam tylko dopasowane słowa W Zmiennej text
, w przeciwnym razie zwraca pustą listę. Ta lista w wyjściu, która jest podobna do atrybutu match
w re.MatchObject.
oto Pełny kod i próbowałem w Pythonie 3.7.
import retext = "He was carefully disguised but captured quickly by police."regEX = r"\w+ly"pattern = re.compile(regEX)search = pattern.search(text)print(search)print(type(search))print()findall = pattern.findall(text)print(findall)print(type(findall))print()finditer = pattern.finditer(text)print(finditer)print(type(finditer))print()for anObject in finditer: print(anObject) print(type(anObject)) print()