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