Lookahead, Lookbehind og Ikke-grådig Matching
Stryg for at vise menuen
Forståelse af avancerede funktioner i regulære udtryk såsom lookahead, lookbehind og ikke-grådige kvantifikatorer gør det muligt at udføre meget præcis mønstergenkendelse i Python. Lookahead og lookbehind er typer af nul-bredde påstande, som gør det muligt at fastslå, om et mønster findes (eller ikke findes) foran eller bag din nuværende position i teksten, uden at inkludere dette mønster i selve matchningen. Ikke-grådige kvantifikatorer giver dig kontrol over, hvor meget tekst et mønster optager, så du kun matcher det nødvendige.
- Lookahead skrives som
(?=...)og tjekker, om et bestemt mønster følger den nuværende position; - Lookbehind, skrevet som
(?<=...), tjekker, om et bestemt mønster går forud for den nuværende position; - Ikke-grådige kvantifikatorer såsom
*?og+?ændrer den standard grådige opførsel for kvantifikatorer; - Som standard matcher kvantifikatorer som
*og+så meget tekst som muligt; ved at tilføje et?gør du dem ikke-grådige, så de matcher så lidt tekst som muligt.
Et eksempel på lookahead: \w+(?=\d) matcher et ord kun hvis det straks efterfølges af et ciffer, men cifferet er ikke en del af matchningen. Et lookbehind fungerer på lignende måde, men i modsat retning.
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)
Hvordan lookahead og ikke-grådige kvantifikatorer påvirker mønstergenkendelse
Lookahead-mønstret \w+(?=\d) i eksemplet matcher enhver sekvens af ordtegn (\w+) kun hvis det direkte efterfølges af et ciffer (\d). Det matchede resultat inkluderer ikke cifferet, fordi lookahead ikke forbruger de tegn, den tjekker for. Dette er nyttigt, når du vil finde ord, der opfylder en bestemt betingelse for, hvad der kommer bagefter, uden at inkludere denne del i matchningen.
Den ikke-grådige kvantifikator *? i <b>(.*?)</b> ændrer, hvor meget tekst der matches mellem <b> og </b>-tags. En grådig kvantifikator som .* ville matche så meget som muligt og potentielt fange alt fra det første <b> til det sidste </b>. Ved at bruge *? matcher mønstret så lidt som muligt og fanger kun teksten inde i hvert tag-par individuelt. Dette forhindrer overmatching og sikrer, at du udtrækker den mindst mulige matchende streng.
Lookahead og ikke-grådige kvantifikatorer giver dig kraftfuld kontrol over, hvordan dine regulære udtryk vælger tekst:
- Lookahead gør det muligt at fastslå, at et match efterfølges af et specifikt mønster uden at inkludere det;
- Ikke-grådige kvantifikatorer hjælper dig med at undgå at fange mere tekst end nødvendigt.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Lookahead, Lookbehind og Ikke-grådig Matching
Forståelse af avancerede funktioner i regulære udtryk såsom lookahead, lookbehind og ikke-grådige kvantifikatorer gør det muligt at udføre meget præcis mønstergenkendelse i Python. Lookahead og lookbehind er typer af nul-bredde påstande, som gør det muligt at fastslå, om et mønster findes (eller ikke findes) foran eller bag din nuværende position i teksten, uden at inkludere dette mønster i selve matchningen. Ikke-grådige kvantifikatorer giver dig kontrol over, hvor meget tekst et mønster optager, så du kun matcher det nødvendige.
- Lookahead skrives som
(?=...)og tjekker, om et bestemt mønster følger den nuværende position; - Lookbehind, skrevet som
(?<=...), tjekker, om et bestemt mønster går forud for den nuværende position; - Ikke-grådige kvantifikatorer såsom
*?og+?ændrer den standard grådige opførsel for kvantifikatorer; - Som standard matcher kvantifikatorer som
*og+så meget tekst som muligt; ved at tilføje et?gør du dem ikke-grådige, så de matcher så lidt tekst som muligt.
Et eksempel på lookahead: \w+(?=\d) matcher et ord kun hvis det straks efterfølges af et ciffer, men cifferet er ikke en del af matchningen. Et lookbehind fungerer på lignende måde, men i modsat retning.
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)
Hvordan lookahead og ikke-grådige kvantifikatorer påvirker mønstergenkendelse
Lookahead-mønstret \w+(?=\d) i eksemplet matcher enhver sekvens af ordtegn (\w+) kun hvis det direkte efterfølges af et ciffer (\d). Det matchede resultat inkluderer ikke cifferet, fordi lookahead ikke forbruger de tegn, den tjekker for. Dette er nyttigt, når du vil finde ord, der opfylder en bestemt betingelse for, hvad der kommer bagefter, uden at inkludere denne del i matchningen.
Den ikke-grådige kvantifikator *? i <b>(.*?)</b> ændrer, hvor meget tekst der matches mellem <b> og </b>-tags. En grådig kvantifikator som .* ville matche så meget som muligt og potentielt fange alt fra det første <b> til det sidste </b>. Ved at bruge *? matcher mønstret så lidt som muligt og fanger kun teksten inde i hvert tag-par individuelt. Dette forhindrer overmatching og sikrer, at du udtrækker den mindst mulige matchende streng.
Lookahead og ikke-grådige kvantifikatorer giver dig kraftfuld kontrol over, hvordan dine regulære udtryk vælger tekst:
- Lookahead gør det muligt at fastslå, at et match efterfølges af et specifikt mønster uden at inkludere det;
- Ikke-grådige kvantifikatorer hjælper dig med at undgå at fange mere tekst end nødvendigt.
Tak for dine kommentarer!