Python Tutorial reguliere expressie

  1. Python reguliere expressiefunctie re.match()
  2. Python reguliere expressie re.search() functie
  3. Reguliere expressies samenstellen met re.complie
  4. Vlaggen in de reguliere expressiemodule van Python re
  5. Controleren op toegestane tekens
  6. Zoeken en vervangen
  7. De findall() functie
  8. De finditer() functie
  9. De split() functie
  10. Basispatronen van re
  11. Herhalingsgevallen
  12. Nongreedy herhaling
  13. Speciale tekens en reeksen in re
  14. De escape functie
  15. De group() functie

In deze tutorial leert u de reguliere expressies en de reguliere expressiebewerkingen die zijn gedefinieerd in de re module in Python. re is de standaardbibliotheek van Python die overeenkomende reguliere expressies ondersteunt.

Reguliere expressie in Python is een set tekens of een reeks die wordt gebruikt om een ​​tekenreeks aan een ander patroon te koppelen met behulp van een formele syntaxis. Je zou reguliere expressies kunnen zien als een kleine programmeertaal die is ingebed in python.

Je kan reguliere expressie gebruiken om enkele regels te definiëren en deze regels worden vervolgens gebruikt om mogelijke tekenreeksen te maken uit de gegeven tekenreeks waarmee u het patroon wilt matchen. Reguliere expressies in Python worden geïnterpreteerd als een set instructies.

Python reguliere expressiefunctie re.match()

Je kan de match-functie gebruiken om het RE-patroon te matchen met de gegeven string. De match-functie bevat vlaggen. Vlaggen definiëren het gedrag van een reguliere expressie en kunnen verschillende waarden bevatten die u later in deze tutorial zult zien.

Het volgende is de syntaxis van de matchfunctie in Python:

re.match(pattern, string, flags)

Het heeft drie argumenten,

  1. pattern is het reguliere expressiepatroon dat moet worden aangepast
  2. string is de gegeven string die moet worden gekoppeld aan reguliere expressie
  3. flags wordt gebruikt om het gedrag van reguliere expressie te veranderen, en het is optioneel.

Als de matching succesvol is uitgevoerd, wordt het Match object geretourneerd, anders NONE wordt het geretourneerd. Match object hebben nog twee hoofdmethoden die zijn group(num) en group() functies. Het hoofddoel van het gebruik van deze functies is om respectievelijk de overeenkomst of een specifieke deelreeks en alle deelreeksen terug te geven.

Gebruik van de re.match functie

Het volgende voorbeeld laat zien hoe u de match functie kunt gebruiken :

import re
strTest = "Hello Python Programming"
mobj = re.match(r"hello", strTest, re.I)
print(mobj.group())

In deze code wordt allereerst de re module geïmporteerd. Vervolgens vergelijk je een string strTest met het RE-patroon en wordt de waarde geretourneerd uit de match-functie toegewezen aan mobj . De match-functie wordt aangeroepen met behulp van re , tussen haakjes is het eerste argument het te matchen patroon, en dan heb je de gegeven string waaruit het patroon zal worden gematcht en wordt ook een vlagwaarde doorgegeven. Hier re.I is de vlagwaarde die IGNORECASE betekent, dus het zal worden genegeerd of het patroon en de tekenreeks verschillende hoofdletters hebben (hoofdletters of kleine letters).

De output is:

Hello

In dit voorbeeld wordt het voorvoegsel r gebruikt dat aangeeft dat de string een onbewerkte string is. In een onbewerkte string is het niet nodig om dubbele schuine strepen te schrijven bij het gebruik van escape-reeksen, bijvoorbeeld als je een backslash wilt, dan heb je gewoon een enkele \ maar geen dubbele backslashes \\ zoals je in reguliere strings had. Dit is het enige verschil tussen een normale string en een onbewerkte string.

Gebruik re.match functie met normale string

Beschouw het onderstaande voorbeeld waarin een normale string wordt gebruikt in plaats van een onbewerkte string:

import re
str = "\\tHello Python Programming"
mobj = re.match("\\thello", str, re.I) #no match

str = "\tHello Python Programming"
mobj = re.match("\\thello", str, re.I) #\thello is matching

Python reguliere expressie re.search() functie

Je kan de re.search() functie gebruiken om het RE-patroon in de gegeven string te zoeken. De search functie bevat drie argumenten in de functie respectievelijk pattern , gegeven string en flags (optioneel).

Het volgende is de syntaxis van de zoekfunctie in Python:

re.search(pattern, string, flags)

De volgende Python-code toont het gebruik van de search() functie:

import re
str = "Hello Python Programming"
sobj = re.search(r"programming", str, re.I)
print(sobj.group())
Programming

In deze code wordt gezocht naar het woord programming . De search functie zoekt in de hele string. Het verschil tussen zoeken en zoeken is dat die match functie alleen aan het begin van de string controleert, terwijl search in de hele string wordt gezocht.

Als u aan het begin van de tekenreeks wilt zoeken, kan je gebruiken ^ . Overweeg het volgende voorbeeld:

import re
str = "Hello Python Programming"
sobj = re.search(r"^programming", str, re.I)
print(sobj.group()) #no match is found

sobj = re.search(r"^hello", str, re.I)
print(sobj.group()) #matching: Hello

Hier ^ wordt alleen aan het begin van de string gezocht.

Je kan ook zoeken aan het einde van de gegeven string. Dit kan $ aan het einde van het patroon worden gedaan . Overweeg de onderstaande code:

import re
str = "Hello Python Programming"
sobj = re.search(r"programming$", str, re.I)
print(sobj.group()) #matching: Programming

sobj = re.search(r"hello$", str, re.I)
print(sobj.group()) #no match found

Reguliere expressies samenstellen met re.complie

Reguliere expressies in Python worden tijdens het compileren omgezet in patronen. Deze patronen zijn eigenlijk de patroonobjecten die verschillende functies bevatten om verschillende taken uit te voeren, zoals zoeken, matchen en vervangen, enz.

Wanneer u een patroon compileert, kan je dat patroon later in het programma gebruiken.

Voorgecompileerde patronen gebruiken

Beschouw de onderstaande code waarin het patroon r"\d" is gecompileerd, wat het eerste cijfer in de string betekent en vervolgens dit patroon gebruikte om de zoekfunctie aan te roepen en een string in de zoekfunctie heeft doorgegeven. Dit patroon wordt gezocht in de tekenreeks die is opgegeven voor de zoekfunctie. Op dezelfde manier kan je dit vooraf gecompileerde patroon met match-functie als volgt gebruiken:

import re
compPat = re.compile(r"(\d)")
sobj = compPat.search("Lalalala 123")
print(mobj.group())

mobj = compPat.match("234Lalalala 123456789")
print(mobj.group())
1
2

Vlaggen in de reguliere expressiemodule van Python re

Je kan vlaggen gebruiken om het gedrag van een reguliere expressie te wijzigen. In een functie zijn vlaggen optioneel. Je kan vlaggen op twee verschillende manieren gebruiken, namelijk door het trefwoord te gebruiken flags en het vlagwaarde toe te wijzen of door de waarde van de vlag direct te schrijven. Je kan meer dan één waarde van vlag hebben in de letterlijke RE; dit kan worden gedaan met behulp van de bitwise OR operator |.

Overweeg de volgende tabel waarin enkele van de meest gebruikte vlaggen worden beschreven met literaire reguliere expressie:

Vlagwaarde Beschrijving
re.I Deze modifier negeert het geval van tekenreeksen en patronen tijdens het matchen.
re.L Deze modifier wordt gebruikt om woorden te interpreteren ten opzichte van de huidige landinstelling.
re.M Deze modifier wordt gebruikt om te zorgen $ dat deze overeenkomt met het einde van de regel en niet met het einde van de reeks. Op dezelfde manier ^ komt het overeen aan het begin van de regel in plaats van aan het begin van de tekenreeks.
re.S Deze modifier wordt gebruikt om een ​​stip . te maken die bij elk karakter past. Dit omvat ook een nieuwe regel.
re.U Deze modifier wordt gebruikt om de tekens te interpreteren als Unicode-tekenset.
re.X Het wordt gebruikt om de witruimten te negeren. Het zal # als een marker van commentaar worden gemaakt.

Gebruik meerdere vlagwaarden

Overweeg de volgende Python-code waarin u zult zien hoe u meerdere vlagwaarden kunt gebruiken om het gedrag van RE te wijzigen. Meerdere vlagwaarden kunnen worden opgenomen door de bitsgewijze OR (|) operator:

import re
s = re.search("L", "Hello")
print(s)        #Output: None, L is there but in small letter and we didn't use flags

s = re.search("L", "Hello", re.I)
print(s)        #Output: 1

s = re.search("L", "^Hello", re.I | re.M)
print(s)        #Output: 1, searching will be made from the start of line and case is ignored

Controleren op toegestane tekens

Je kan ook controleren of een bepaalde tekenreeks een bepaald bereik met tekens bevat of niet.

Een functie definiëren en toegestane tekens controleren

Beschouw het volgende voorbeeld waarin een functie is gedefinieerd en ook een voorgecompileerd patroon gebruikt om te controleren of de bepaalde tekens zich in de doorgegeven string bevinden of niet:

import re
def check(str):
    s = re.compile(r'[^A-Z]')
    str = s.search(str)
    return not bool(str)
print(check("HELLOPYTHON"))     #Output: True
print(check("hellopython"))     #Output: False

In deze functie wordt een patroon dat is r '[^A-Z]' gecompileerd en gebruikt om te zoeken in een doorgegeven string wanneer deze functie met de naam check wordt aangeroepen. Deze functie controleert feitelijk of de doorgegeven string letters A-Z (hoofdletters) bevat of niet. Evenzo is te zien dat wanneer u een string in kleine letters doorgeeft, false wordt geretourneerd.

Zoeken en vervangen

De re module biedt een functie die sub functie is die wordt gebruikt om alle pattern instanties string van het gegeven te vervangen met behulp van het repl kenmerk in de functie. De tekens worden vervangen totdat het count nummer is bereikt. De sub functie retourneert de bijgewerkte tekenreeks.

Het volgende is de syntaxis van de subfunctie:

re.sub(pattern, repl, string, count = 0)

Met behulp van sub functie

Beschouw het onderstaande voorbeeld waarin de sub functie de gehele string vervangt door een gegeven string:

import re
s = "Playing 4 hours a day"
obj = re.sub(r'^.*$',"Working",s)
print(obj)
Working

Hier wordt de sub functie gebruikt. Het patroon r'^.*$ betekent beginnend bij het begin van de string en .* betekent dan alles wat zich in de string bevindt tot het einde $ van de string. Dan "Working" vervangt het argument de hele string s.

Gebruik de sub functie om alle cijfers van een string te verwijderen

Beschouw het volgende voorbeeld waarin de sub functie de cijfers in de gegeven string verwijdert. Voor dit doel kan je gebruiken \d :

import re
s = "768 Working 2343 789 five 234 656 hours 324 4646 a 345 day"
obj = re.sub(r'\d',"",s)
print(obj)
Working   five   hours   a  day

Op dezelfde manier kan je de tekens uit de tekenreeks verwijderen. Voor dit doel kan je gebruiken \D.

import re
s = "768 Working 2343 789 five 234 656 hours 324 4646 a 345 day"
obj = re.sub(r'\D',"",s)
print(obj)
76823437892346563244646345

De findall() functie

De findall functie retourneert een lijst met alle tekenreeksen die overeenkomen met het patroon. Het verschil tussen search en findall functie is dat findall alle overeenkomsten worden gevonden, terwijl search alleen de eerste overeenkomst wordt gevonden. Met deze functie worden de niet-overlappende overeenkomsten gevonden en geretourneerd als een lijst met tekenreeksen.

Het volgende is de syntaxis van findall functie:

findall(pattern, string, flags)

Hier pattern is het RE-patroon dat u zult vinden in gegeven string met enkele flags waarden, bijvoorbeeld re.I om een ​​hoofdletter te negeren.

Zoek alle niet-overlappende overeenkomsten

In het volgende voorbeeld worden findall niet-overlappende overeenkomsten gevonden:

import re
str = "Working 6 hours a day. Studying 4 hours a day."
mobj = re.findall(r'[0-9]', str)
print(mobj)
['6', '4']

r'[0-9]' is een patroon dat alle cijfers in de gegeven string vindt en een lijst met strings wordt geretourneerd (ongeacht of het cijfers zijn) die is opgeslagen in mobj.

findall met bestanden

Je kan ook gebruiken findall om in een bestand te zoeken. Wanneer u findall een bestand gebruikt, wordt er een lijst met alle overeenkomende tekenreeksen in het bestand geretourneerd. Omdat de read() functie van het bestand wordt gebruikt, hoeft u niet elke regel van het bestand opnieuw te doorlopen met behulp van een lus, omdat de volledige tekst van het bestand als een tekenreeks wordt geretourneerd. Overweeg het volgende voorbeeld:

import re
file = open('asd.txt', 'r')
mobj = re.findall(r'arg.', file.read())
print(mobj)
file.close()
['arg,', 'arg,', 'arg,', 'argv', 'argv', 'argv']

In dit voorbeeld wordt het bestand eerst geopend in de leesmodus. Het patroon r'arg.' komt overeen met de inhoud van het bestand en jij hebt de lijst met overeenkomende tekenreeksen in de uitvoer.

De finditer() functie

De finditer functie kan worden gebruikt om het RE-patroon in tekenreeksen te vinden, samen met de locatie van overeenkomende tekenreeksen die de index van de tekenreeksen is. Deze functie doorloopt eigenlijk de overeenkomende tekenreeksen en geeft de indexen of locaties van de tekenreeks terug.

Het volgende is de syntaxis van finditer functie:

finditer(pattern, string, flags)

Herhalen over wedstrijden

Het enige verschil tussen findall en finditer is dat finditer de index ook wordt geretourneerd samen met overeenkomende tekenreeksen. In de onderstaande code finditer wordt gebruikt om de locaties van de overeenkomende tekenreeksen te vinden tijdens het herhalen van overeenkomsten (overeenkomende tekenreeksen) met behulp van voor lus.

import re
str = "Working 6 hours a day. Studying 4 hours a day."
pat = r'[0-9]'
for mobj in re.finditer(pat, str):
    s = mobj.start()
    e = mobj.end()
    g = mobj.group()
    print('{} found at location [{},{}]'.format(g, s, e))
6 found at location [8,9]
4 found at location [32,33]

In dit voorbeeld bestaat het patroon uit de cijfers van 0 tot en met 9 str . for lus wordt herhaald over de overeenkomende tekenreeksen die worden geretourneerd door finditer . In de lus, functies start , end en group de terugkeer van de start-index, eindigend index en vond match respectievelijk in elke iteratie van de string teruggegeven door finditer.

De split() functie

De split functie wordt gebruikt om een ​​string te splitsen.

Het volgende is de syntaxis van de gesplitste functie:

split(patter, string, maxsplit, flags)

Hier max is het totale aantal tekenreekssplitsingen. Als er maximaal maxsplit splitsingen optreden, wordt de rest van de tekenreeks geretourneerd als het laatste element van de lijst. De standaardwaarde van max is 0 onbeperkte splitsingen.

Een string splitsen

split functie retourneert elk woord in een string

In de onderstaande code wordt een string gesplitst volgens het gegeven patroon en het aantal max-splitsingen.

import re
str = "Birds fly high in the sky for ever"
mobj = re.split('\s+', str, 5)
print(mobj)
['Birds', 'fly', 'high', 'in', 'the', 'sky for ever']

In dit voorbeeld is het patroonteken \s een speciaal teken dat overeenkomt met het witteken, dat overeenkomt met [ \t\n\r\f\v] . Daarom zou je woorden gescheiden kunnen hebben. De waarde van max is 5 hier die 6 splitst en het laatste element is de rest van de string na de 5de split.

Basispatronen van re

Reguliere expressies kunnen patronen specificeren die worden vergeleken met gegeven strings. Hier volgen de basispatronen van reguliere expressie:

Patroon Beschrijving
^ Het wordt gebruikt om te matchen aan het begin van de string.
$ Dit patroon komt overeen aan het einde van de string.
. Punt wordt gebruikt om één teken te matchen (nieuwe regel is niet inbegrepen).
[...] Het wordt gebruikt om een ​​enkel karakter tussen haakjes te matchen.
[^...] Dit komt overeen met een enkel teken, maar niet tussen haakjes.
* 0 of meer voorkomens van voorgaande re in gegeven string.
+ 1 of meer gevallen van voorgaande her in gegeven string.
? 0 of 1 voorkomens van voorgaande re in gegeven string.
{n} Het komt overeen met n aantal keren dat een bepaalde string voorkomt.
{n,} Het komt overeen met n of meer dan n aantal gebeurtenissen.
{n,m} Dit patroon wordt gebruikt om minimaal n en maximaal m overeenkomsten in de string aan te passen.
`a b`
(re) Dit patroon wordt gebruikt om de reguliere expressies te groeperen en de overeenkomende tekst te onthouden.
(?imx) Het schakelt tijdelijk in op i of m of x in RE. Bij het gebruik van haakjes wordt alleen het haakjesgebied beïnvloed.
(?-imx) Het schakelt i of m of x tijdelijk uit in RE. Bij het gebruik van haakjes wordt alleen het haakjesgebied beïnvloed.
(?: re) Dit patroon wordt gebruikt om de reguliere expressies te groeperen, maar de overeenkomende tekst wordt niet onthouden.
(?imx: re) Het schakelt tijdelijk tussen i of m of x tussen RE tussen haakjes.
(?-imx: re) Het schakelt tijdelijk i of m of x tussen RE tussen haakjes uit.
(?#...) Het is een opmerking.
(?= re) Het wordt gebruikt om de positie op te geven met behulp van een patroon. Het heeft geen bereik.
(?! re) Het wordt gebruikt om de positie op te geven met behulp van een patroonontkenning. Het heeft geen bereik.
(?> re) Dit patroon wordt gebruikt om een ​​onafhankelijk patroon te matchen.
\w Dit patroon wordt gebruikt om woorden te matchen.
\W Dit patroon wordt gebruikt om niet-woorden te matchen.
\s Het komt overeen met witruimten. \s is gelijk aan [ \t\n\r\f]f].
\S Het komt overeen met niet-witruimten.
\d gelijk aan [0-9] . Het komt overeen met cijfers in de string.
\D Het komt overeen met niet-cijfers.
\A overeenkomen met het begin van de tekenreeks.
\Z match einde van de string. En als er een nieuwe regel is, komt deze overeen met de nieuwe regel.
\G overeenkomen met het punt waar de laatste wedstrijd is afgelopen.
\b zoek woordgrenzen wanneer buiten de haakjes, maar wanneer tussen haakjes het overeenkomt met de backspace.
\B match niet-woordgrenzen.
\n, \t, etc. \n wordt gebruikt om nieuwe regels te matchen, \t komt overeen met tabblad enzovoort.
\1...\9 Dit patroon komt overeen met de derde subexpressie (gegroepeerd).
\10 \10 komt meestal overeen met de nde subexpressie (gegroepeerd) als de match al is gedaan. Als match nog niet is gedaan, geeft \ 10 een octale weergave van een tekencode.

Herhalingsgevallen

De volgende tabel toont enkele voorbeelden van herhalingsgevallen met een beschrijving:

Voorbeelden beschrijvingen
ab? Het komt overeen met a of ab.
ab* ab * komt overeen met ab en a’s en eventuele a’s gevolgd door eventuele b’s.
ab+ ab + betekent a’s gevolgd door b’s en niet alleen a. a moet worden gevolgd door niet nul b.
\d{2} Het komt exact overeen met 2 cijfers.
\d{2,} Het komt overeen met 2 of meer cijfers.
\d{2,4} Het komt overeen met de cijfers 2, 3 en 4.

Nongreedy herhaling

In reguliere expressies is herhaling standaard hebzuchtig en probeert het zoveel mogelijk herhalingen te evenaren.

De kwalificaties zoals * , + en ? zijn hebzuchtige kwalificaties. Wanneer u gebruikt .* , zal het een hebzuchtige match uitvoeren en de hele string matchen, wat resulteert in het matchen van zoveel mogelijk tekens. Overweeg de onderstaande code:

import re
mobj = re.match(r'.*', "Birds fly high in sky")
print(mobj.group())
Birds fly high in the sky

Dus je kunt hier zien dat de hele string overeenkomt.

Wanneer u toevoegt ? met .+ u een niet hebzuchtig re hebben en het patroon .+? komt overeen met zo weinig tekens mogelijk in de string.

import re
mobj = re.match(r'.*', "Birds fly high in sky")
print(mobj.group())

Het resultaat is het eerste teken van de tekenreeks

B

Speciale tekens en reeksen in re

Speciale tekens re beginnen met een \ . We hebben bijvoorbeeld een overeenkomst \A die overeenkomt met het begin van de tekenreeks.

Deze speciale tekens worden in de bovenstaande tabel beschreven.

In dit gedeelte worden de voorbeelden van enkele speciale tekens getoond:

import re
str = "Birds fly high in the sky"
# \A
mobj = re.match(r'\Ab', str, re.I) #OUTPUT: B, here \A will match at beginning only.

#\d
mobj = re.match(r'\d', "4 birds are flying") #OUTPUT: 4

#\s
mobj = re.split('\s+', "birds fly high in the sky", 1) #OUTPUT: ['Birds', 'fly']

De escape functie

De escape functie wordt gebruikt om alle tekens uit de reeks te ontsnappen. De ASCII-letters, cijfers en _ worden niet ontsnapt. De escape functie wordt gebruikt wanneer u metatekens uit een string wilt extraheren.

Hierna volgt de syntaxis van de escape-functie:

escape(pattern)

In het volgende voorbeeld wordt een string www.python.com doorgegeven om te ontsnappen. Hierin hebben we . een metacharacter en het wordt geëxtraheerd of gekoppeld:

print(re.escape('www.python.com'))
www\.python\.com

Hier . is een metateken dat wordt geëxtraheerd of gekoppeld. Telkens wanneer een metateken met behulp van de escape-functie wordt gekoppeld, moet u \ vóór het teken staan.

Ontsnappende speciale tekens

De tekens houden van haakjes [ en ] kunnen niet worden gekoppeld. Overweeg het volgende voorbeeld:

import re
mobj = re.search(r'[a]', '[a]b')
print(mobj.group())
a

Hier kun je zien dat beugels [ en ] zijn niet op elkaar afgestemd.

Je kunt ze matchen met behulp van de escape-functie:

import re
mobj = re.search(r'\[a\]', '[a]b')
print(mobj.group())
[a]b

De group() functie

De group functie wordt gebruikt om een ​​of meer subgroepen van de gevonden overeenkomst te retourneren. De group functie kan enkele argumenten hebben.

Het volgende is de syntaxis van de groepsfunctie:

group(group1, group2,..., groupN)

Als u een enkel argument in de groepsfunctie hebt, is het resultaat een enkele tekenreeks, maar als u meer dan één argument hebt, is het resultaat een tuple (met één item per argument).

Als er geen argument is, is het argument standaard nul en wordt de volledige overeenkomst geretourneerd.

Als het argument groupN nul is, is de retourwaarde de volledige tekenreeks.

Wanneer u het groepsnummer of argument opgeeft als een negatieve waarde of een waarde die groter is dan het aantal groepen in een patroon, treedt een IndexError uitzondering op.

Beschouw de onderstaande code waarin er geen group functieargument is dat gelijk is aan groep (0).

import re
str = "Working 6 hours a day"
mobj = re.match(r'^.*', str)
print(mobj.group())
Working 6 hours a day

Hier wordt group() gebruikt en hebt u de volledige overeenkomende tekenreeks.

Delen van bijpassende teksten kiezen

In het volgende voorbeeld wordt group functie gebruikt met argumenten om overeenkomende groepen op te halen:

import re
a = re.compile('(p(q)r)s')
b = a.match('pqrs')
print(b.group(0))
print(b.group(1))
print(b.group(2))
pqrs
pqr
q

Hier group(0) keert de hele wedstrijd terug. group(1) zal de eerste wedstrijd teruggeven die is pqr en group(2) zal de tweede wedstrijd teruggeven die is q.

Benoemde groepen

Met benoemde groepen kan je een vastleggroep maken. Deze groep kan dan worden aangeduid met de naam. Overweeg het onderstaande voorbeeld:

import re
mobj = re.search(r'Hi (?P<name>\w+)', 'Hi Roger')
print(mobj.group('name'))
Roger

Niet-vastleggende groepen

Niet-vastleggende groepen kunnen worden gemaakt met ?: . Niet-vastleggende groep wordt gebruikt als u de inhoud van de groep niet wilt.

import re
mobj = re.match("(?:[pqr])+", "pqr")
print(mobj.groups())
()