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()