odlišné chování mezi re.finditer a re.findall

tento příklad získávám z operací regulárních výrazů v Pythonu 2.* Dokumentace a tento příklad je zde podrobně popsán s některými úpravami. Vysvětlit celý příklad, pojďme se řetězec proměnné typu volání,

text = "He was carefully disguised but captured quickly by police."

a kompilace typu regulární výraz vzor jako,

regEX = r"\w+ly"pattern = re.compile(regEX)

\w tím tomuto znaku odpovídá libovolný znak (alfanumerické & podtržítko), + zápasů 1 nebo více výskytů předcházejícího token a celý význam, je vybrat jakékoliv slovo, které je end-s ly. Existují pouze dvě slova 2 („opatrně“ a „rychle“), která je splněna výše uvedeným regulárním výrazem.

před přesunem do re.findall () nebo re.finditer (), podívejme se, co dělá re.vyhledávání () znamená v Pythonu 2.* Dokumentace.

Prohledejte řetězec hledáním prvního místa, kde vzor regulárního výrazu vytvoří shodu, a vraťte odpovídající instanci MatchObject. Vrátit Žádné, pokud žádná pozice v řetězci neodpovídá vzoru; všimněte si, že se to liší od nalezení shody s nulovou délkou v určitém bodě řetězce.

následující řádky kódu vám základní pochopení re.vyhledávání().

search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>

bude generovat re.MatchObject objektu typu třídy, který má 13 podporovaných metod a atributů podle Pythonu 2.* Dokumentace. Tato span() metoda se skládá s počáteční a koncové body(7 a 16 přítomných ve výše uvedeném příkladu) odpovídající slovo v text proměnné. požár.metoda search () zvažuje pouze první shodu, jinak se vrátí None.

pojďme se podívat na otázku, před tím, co dělá re.finditer () znamená v Pythonu 2.* Dokumentace.

vrátí iterátor, který získá instance MatchObject přes všechny nepřekrývající se shody pro RE vzor v řetězci. Řetězec je naskenován zleva doprava a zápasy jsou vráceny v nalezeném pořadí. Prázdné zápasy jsou zahrnuty do výsledku.

přicházející další řádky kódu vám dává základní pochopení re.finditer ().

finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>

výše uvedený příklad nám dává objekty Iterátoru, které musí být smyčka. To samozřejmě není výsledek, který chceme. Pojďme smyčku finditer a uvidíme, co je uvnitř tohoto Iterátoru objektů.

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'>

tyto výsledky jsou velmi podobné re.vyhledávání () výsledek, který dostaneme dříve. Ale můžeme vidět nový výsledek ve výše uvedeném výstupu, <re.Match object; span=(40, 47), match='quickly'>. Jak jsem zmínil dříve v Pythonu 2.* Dokumentace, re.vyhledávání () prohledá řetězec a hledá první místo, kde vzor regulárního výrazu vytvoří shodu a znovu.finditer () prohledá řetězec a hledá všechna místa, kde vzor regulárního výrazu vytváří shody, a vrátí více podrobností než znovu.metoda findall ().

zde co re.findall () znamená v Pythonu 2.* Dokumentace.

vrátí všechny nepřekrývající se shody vzoru v řetězci jako seznam řetězců. Řetězec je naskenován zleva doprava a zápasy jsou vráceny v nalezeném pořadí. Pokud je ve vzoru přítomna jedna nebo více skupin, vraťte seznam skupin; toto bude seznam n-tic, pokud má vzor Více než jednu skupinu. Prázdné zápasy jsou zahrnuty do výsledku.

pojďme pochopit, co se stalo v re.findall ().

findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>

tento výstup nám dává pouze odpovídající slova v proměnné text, jinak vrátí prázdný seznam. Tento seznam ve výstupu, který je podobný atributu match v re.MatchObject.

zde je úplný kód a snažil jsem se v Pythonu 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()