logo

Patroonmatching in Python met Regex

U bent wellicht bekend met het zoeken naar tekst door op Ctrl-F te drukken en de woorden te typen waarnaar u zoekt. Reguliere expressies gaan nog een stap verder: ze stellen u in staat een tekstpatroon op te geven waarnaar u wilt zoeken. In dit artikel zullen we zien hoe patroonmatching in Python werkt met Regex.

Regex in Python

Normale uitdrukkingen , ook wel genoemd regex , zijn beschrijvingen van een tekstpatroon. Het kan de aan- of afwezigheid van een tekst detecteren door deze te matchen met een bepaald patroon en kan een patroon ook opsplitsen in een of meer subpatronen. Bijvoorbeeld, een D in een regex staat voor een cijferteken, dat wil zeggen elk enkel cijfer tussen 0 en 9.



Controleer telefoonnummers met Regex in Python

De volgende regex wordt gebruikt in Python om overeen te komen met een reeks van drie cijfers, een koppelteken, nog drie cijfers, nog een koppelteken en vier cijfers.

Any other string would not match the pattern. ddd-ddd-dddd>

Reguliere expressies kunnen veel geavanceerder zijn. Als u bijvoorbeeld een 3 tussen accolades ({3}) toevoegt na een patroon, betekent dit hetzelfde als zeggen: Match dit patroon drie keer. De iets kortere regex is dus als volgt:



vervang de tekenreeks in tekenreeksjava
d{3}-d{3}-d{4}>

Het komt overeen met het juiste telefoonnummerformaat.

Patroonmatching met reguliere expressies

Een Regex-object zoekopdracht() methode zoekt in de string die wordt doorgegeven naar overeenkomsten met de regex. Match-objecten hebben een group()-methode die de feitelijk overeenkomende tekst uit de gezochte tekenreeks retourneert. Je kunt het ook zienRegex-cheetsheetvoor meer informatie.

Voorbeeld: Importeer de regex-module met import re. Maak een Regex-object met deopnieuw compileren()functie. (Vergeet niet dat u een onbewerkte tekenreeks gebruikt.) Geef de tekenreeks waarin u wilt zoeken door aan de methode search() van het Regex-object. Dit retourneert een Match-object. Roep de methode group() van het Match-object aan om een ​​tekenreeks van de feitelijk overeenkomende tekst te retourneren.



Python3




# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())>

>

>

Uitgang:

Phone number found: 415-555-4242>

Haakjes voor groeperen en vastleggen met Regex

Een van de manieren om patronen te matchen met Regex is door haakjes rond de patronen te gebruiken. Laten we een paar verschillende voorbeelden bekijken voor een beter begrip.

Bijpassende objecten

Stel dat u het netnummer wilt scheiden van de rest van het telefoonnummer. Door haakjes toe te voegen worden groepen aangemaakt in de regex: (ddd)-(ddd-dddd). Vervolgens kunt u de objectmethode group() match gebruiken om de overeenkomende tekst uit slechts één groep te halen.

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)>

>

>

Uitgang:

415 area code: 415 number: 555-4242>

Haal alle groepen in één keer op

Als u alle groepen in één keer wilt ophalen, gebruikt u de methode groups(), - let op de meervoudsvorm voor de naam.

Python3




tekenreeks als een array

import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())>

>

>

Uitgang:

('415', '555-4242')>

Overeenkomen met een haakje

Haakjes hebben een speciale betekenis in reguliere expressies, maar wat moet je doen als je een haakje in je tekst moet matchen? Het kan bijvoorbeeld zijn dat bij de telefoonnummers die u probeert te matchen het netnummer tussen haakjes staat. In dit geval moet u de tekens ( en ) voorzien van een backslash. Voer het volgende in de interactieve shell in:

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))>

>

>

Uitgang:

(415)>

De escape-tekens ( en ) in de onbewerkte tekenreeks die wordt doorgegeven aan re.compile() komen overeen met de werkelijke tekens tussen haakjes.

Reguliere expressies: groepering en het pijpkarakter

De | karakter wordt een pijp genoemd. We kunnen het overal gebruiken waar we een van de vele uitdrukkingen willen matchen.

Voorbeeld: De reguliere expressie r’Batman|Tina Fey’ komt overeen met ‘Batman’ of ‘Tina Fey’. Wanneer zowel Batman als Tina Fey in de gezochte reeks voorkomen, wordt de eerste keer dat de overeenkomende tekst voorkomt, geretourneerd als het Match-object.

Python3




# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())>

>

>

Uitgang:

'Batman'>

Accolades begrijpen in Regex

Als we een groep hebben die we een bepaald aantal keren willen herhalen, volg dan de groep in de regex met een getal tussen accolades.

De regex (Ha){3} komt bijvoorbeeld overeen met de string ‘HaHaHa’, maar niet met ‘HaHa’, aangezien deze laatste slechts twee herhalingen van de (Ha) groep heeft. In plaats van slechts één getal kunt u een bereik tussen de accolades opgeven. De regex (Ha){3, 5} komt overeen met ‘HaHaHa’, ‘HaHaHaHa’ en ‘HaHaHaHaHa’. U kunt ook het eerste of tweede getal tussen de accolades weglaten om het minimum of maximum onbegrensd te laten. (Ha){3, } komt overeen met drie of meer instanties van de (Ha) groep, terwijl (Ha){, 5} nul tot vijf instanties zal matchen. Accolades kunnen helpen uw reguliere expressies korter te maken.

Voorbeeld 1: In dit voorbeeld gebruiken we accolades om aan te geven waar het patroon voorkomt waarnaar we op zoek zijn.

Python3




# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())>

Java-reeks cmp

>

>

Uitgang:

HaHaHa>

Voorbeeld 2: In dit voorbeeld definiëren we het voorkomen van het patroon met behulp van accolades en zoeken we vervolgens of er een specifiek patroon in voorkomt of niet.

Python3




# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)>

>

>

Uitgang:

True>

Optionele operator of vraagteken (?) in reguliere expressie

Soms is er een patroon dat u alleen optioneel wilt matchen. Dat wil zeggen dat de regex een overeenkomst moet vinden, ongeacht of dat stukje tekst er wel of niet is. De ? karakter markeert de groep die eraan voorafgaat als een optioneel onderdeel van het patroon.

Voorbeeld 1: Hier gaan we op zoek naar een patroon met patroon ‘Batman’ of ‘Batwoman’. De (waar)? een deel van de reguliere expressie betekent dat het patroon wo een optionele groep is. De regex komt overeen met tekst die nul exemplaren of één exemplaar van wo bevat. Dit is de reden waarom de regex overeenkomt met zowel ‘Batwoman’ als ‘Batman’. Je kunt denken aan de ? zoals gezegd, groepen Match nul of één van de groepen voorafgaand aan dit vraagteken.

Als u een daadwerkelijk vraagteken wilt matchen, kunt u hieraan ontsnappen met ?.

Python3




# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())>

>

>

Uitgang:

Batman Batwoman>

Nul of meer patroonmatching met de ster

De * (de ster of asterisk genoemd) betekent overeenkomen met nul of meer — de groep die aan de ster voorafgaat, kan een willekeurig aantal keren in de tekst voorkomen. Het kan volledig afwezig zijn of keer op keer herhaald worden. Als u een echt sterteken wilt matchen, zet u de ster in de reguliere expressie vooraf met een backslash, *.

Voorbeeld 1: In dit voorbeeld matchen we de nul-exemplaren van een patroon in de string. Het (wo)*-gedeelte van de regex komt overeen met nul exemplaren van wo in de tekenreeks.

Python3




# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())>

>

>

Uitgang:

Java-multithreading
Batman>

Voorbeeld 2: In dit voorbeeld zullen we minstens één exemplaar van een patroon in de string matchen.

Python




#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())>

>

>

Uitgang:

Batwoman>

Voorbeeld 3: In dit voorbeeld zullen we meer dan één exemplaar van een patroon in de string matchen.

Python




# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())>

>

>

Uitgang:

Batwowowowoman>

Eén of meer patronen die overeenkomen met de Plus

Terwijl * middelen overeenkomen met nul of meer , de + (of plus) betekent overeenkomen met een of meer. In tegenstelling tot de ster, waarbij de groep niet in de overeenkomende string hoeft te verschijnen, moet de groep die aan een plus voorafgaat minstens één keer voorkomen. Het is niet optioneel. Als je een echt plusteken moet matchen, plaats dan een backslash om het plusteken vooraf te laten gaan: +.

Voorbeeld 1: In dit voorbeeld zullen we minstens één exemplaar van een patroon in de string matchen.

Python3




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())>

>

>

Uitgang:

Batwoman>

Voorbeeld 2: In dit voorbeeld komt de regex Bat(wo)+man niet overeen met de string ‘The Adventures of Batman’ omdat er minstens één wo vereist is door het plusteken.

leegte 0

Python




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)>

>

>

Uitgang:

True>

Gerelateerd artikel Regex-cheetsheet