Lookahead, Lookbehind och Icke-glupsk Matchning
Svep för att visa menyn
Att förstå avancerade funktioner i reguljära uttryck såsom lookahead, lookbehind och icke-glupska kvantifikatorer gör det möjligt att utföra mycket precisa mönstermatchningar i Python. Lookahead och lookbehind är typer av nollbreddsassertioner, vilket innebär att du kan kontrollera om ett mönster finns (eller inte finns) framför eller bakom din nuvarande position i texten, utan att inkludera det mönstret i själva matchningen. Icke-glupska kvantifikatorer låter dig styra hur mycket text ett mönster konsumerar, så att du endast matchar så mycket som behövs.
- Lookahead skrivs som
(?=...)och kontrollerar om ett visst mönster följer den aktuella positionen; - Lookbehind, som skrivs
(?<=...), kontrollerar om ett visst mönster föregår den aktuella positionen; - Icke-glupska kvantifikatorer såsom
*?och+?ändrar det standardmässigt glupska beteendet hos kvantifikatorer; - Som standard matchar kvantifikatorer som
*och+så mycket text som möjligt; genom att lägga till ett?gör du dem icke-glupska, så att de matchar så lite text som möjligt.
Ett exempel på lookahead: \w+(?=\d) matchar ett ord endast om det omedelbart följs av en siffra, men siffran ingår inte i matchningen. En lookbehind fungerar på liknande sätt men i motsatt riktning.
1234567891011121314import re # Lookahead: Match words followed by a digit text = "apple1 banana2 cherry pie" pattern_lookahead = r"\w+(?=\d)" matches_lookahead = re.findall(pattern_lookahead, text) print("Lookahead matches:", matches_lookahead) # Non-greedy matching: Extract text between tags html = "<b>Bold</b> and <b>Strong</b>" pattern_nongreedy = r"<b>(.*?)</b>" matches_nongreedy = re.findall(pattern_nongreedy, html) print("Non-greedy matches:", matches_nongreedy)
Hur lookahead och icke-glupska kvantifikatorer påverkar mönstermatchning
Lookahead-mönstret \w+(?=\d) i exemplet matchar varje sekvens av ordtecken (\w+) endast om den direkt följs av en siffra (\d). Det matchade resultatet inkluderar inte siffran, eftersom lookahead inte konsumerar de tecken den kontrollerar. Detta är användbart när du vill hitta ord som uppfyller ett visst villkor om vad som kommer härnäst, utan att inkludera den delen i matchningen.
Den icke-glupska kvantifikatorn *? i <b>(.*?)</b> ändrar hur mycket text som matchas mellan <b> och </b>-taggarna. En glupsk kvantifikator som .* skulle matcha så mycket som möjligt, och potentiellt fånga allt från första <b> till sista </b>. Genom att använda *? matchar mönstret så lite som möjligt, och fångar endast texten inom varje taggpar individuellt. Detta förhindrar övermatchning och säkerställer att du extraherar den minsta möjliga matchande delsträngen.
Lookahead och icke-glupska kvantifikatorer ger dig kraftfull kontroll över hur dina reguljära uttryck väljer text:
- Lookahead låter dig kontrollera att en matchning följs av ett specifikt mönster utan att inkludera det;
- Icke-glupska kvantifikatorer hjälper dig att undvika att fånga mer text än nödvändigt.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal