Python RegEx
Python RegEx
In deze tutorial leer je over reguliere expressies (RegEx) en gebruik je de re-module van Python om met RegEx te werken (met behulp van voorbeelden).
Een Reg ular Ex pression (RegEx) is een reeks tekens die een zoekpatroon definieert. Bijvoorbeeld,
^a...s$
De bovenstaande code definieert een RegEx-patroon. Het patroon is:elke tekenreeks van vijf letters die begint met a en eindigend met s .
Een patroon dat is gedefinieerd met RegEx kan worden gebruikt om te matchen met een tekenreeks.
Expressie | String | Overeenkomend? |
---|---|---|
^a...s$ | abs | Geen overeenkomst |
alias | Overeenkomst | |
abyss | Overeenkomst | |
Alias | Geen overeenkomst | |
An abacus | Geen overeenkomst |
Python heeft een module met de naam re
om met RegEx te werken. Hier is een voorbeeld:
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Search successful.")
else:
print("Search unsuccessful.")
Hier gebruikten we re.match()
functie om patroon te zoeken binnen de test_string . De methode retourneert een match-object als de zoekopdracht succesvol is. Zo niet, dan retourneert het None
.
Er zijn andere verschillende functies gedefinieerd in de re module om met RegEx te werken. Laten we, voordat we dat onderzoeken, leren over reguliere expressies zelf.
Als je de basis van RegEx al kent, ga dan naar Python RegEx.
Patroon opgeven met RegEx
Om reguliere expressies te specificeren, worden metatekens gebruikt. In het bovenstaande voorbeeld, ^
en $
zijn metatekens.
Metakarakters
Metatekens zijn tekens die op een speciale manier worden geïnterpreteerd door een RegEx-engine. Hier is een lijst met metatekens:
[] . ^ $ * + ? {} () \ |
[]
- Vierkante haken
Vierkante haken specificeren een reeks tekens die u wilt matchen.
Expressie | String | Overeenkomend? |
---|---|---|
[abc] | a | 1 overeenkomst |
ac | 2 overeenkomsten | |
Hey Jude | Geen overeenkomst | |
abc de ca | 5 overeenkomsten |
Hier, [abc]
komt overeen als de tekenreeks die u probeert te matchen een van de a
. bevat , b
of c
.
U kunt ook een reeks tekens opgeven met -
tussen vierkante haken.
[a-e]
is hetzelfde als[abcde]
.[1-4]
is hetzelfde als[1234]
.[0-39]
is hetzelfde als[01239]
.
U kunt de tekenset aanvullen (omkeren) met het caret ^
symbool aan het begin van een vierkante haak.
[^abc]
betekent elk teken behalve a of b of c .[^0-9]
betekent elk niet-cijferig teken.
.
- Periode
Een punt komt overeen met elk enkel teken (behalve nieuwe regel '\n'
).
Expressie | String | Overeenkomend? |
---|---|---|
.. | a | Geen overeenkomst |
ac | 1 overeenkomst | |
acd | 1 overeenkomst | |
acde | 2 overeenkomsten (bevat 4 tekens) |
^
- Caret
Het dakje ^
wordt gebruikt om te controleren of een tekenreeks begint met een bepaald karakter.
Expressie | String | Overeenkomend? |
---|---|---|
^a | a | 1 overeenkomst |
abc | 1 overeenkomst | |
bac | Geen overeenkomst | |
^ab | abc | 1 overeenkomst |
acb | Geen overeenkomst (begint met a maar niet gevolgd door b ) |
$
- Dollar
Het dollarteken $
wordt gebruikt om te controleren of een string eindigt met een bepaald karakter.
Expressie | String | Overeenkomend? |
---|---|---|
a$ | a | 1 overeenkomst |
formula | 1 overeenkomst | |
cab | Geen overeenkomst |
*
- Ster
Het stersymbool *
komt overeen met nul of meer keren van het patroon dat eraan is overgelaten.
Expressie | String | Overeenkomend? |
---|---|---|
ma*n | mn | 1 overeenkomst |
man | 1 overeenkomst | |
maaan | 1 overeenkomst | |
main | Geen overeenkomst (a wordt niet gevolgd door n ) | |
woman | 1 overeenkomst |
+
- Plus
Het plusteken +
komt overeen met een of meer exemplaren van het patroon dat eraan is overgelaten.
Expressie | String | Overeenkomend? |
---|---|---|
ma+n | mn | Geen overeenkomst (geen a teken) |
man | 1 overeenkomst | |
maaan | 1 overeenkomst | |
main | Geen overeenkomst (a wordt niet gevolgd door n) | |
woman | 1 overeenkomst |
?
- Vraagteken
Het vraagtekensymbool ?
komt overeen met nul of één keer van het patroon dat eraan is overgelaten.
Expressie | String | Overeenkomend? |
---|---|---|
ma?n | mn | 1 overeenkomst |
man | 1 overeenkomst | |
maaan | Geen overeenkomst (meer dan één a teken) | |
main | Geen overeenkomst (a wordt niet gevolgd door n) | |
woman | 1 overeenkomst |
{}
- Beugel
Beschouw deze code:{n,m}
. Dit betekent minimaal n , en maximaal m herhalingen van het patroon dat eraan is overgelaten.
Expressie | String | Overeenkomend? |
---|---|---|
a{2,3} | abc dat | Geen overeenkomst |
abc daat | 1 overeenkomst (op daat ) | |
aabc daaat | 2 overeenkomsten (op aabc en daaat ) | |
aabc daaaat | 2 overeenkomsten (op aabc en daaaat ) |
Laten we nog een voorbeeld proberen. Deze RegEx [0-9]{2, 4}
komt overeen met minimaal 2 cijfers maar niet meer dan 4 cijfers
Expressie | String | Overeenkomend? |
---|---|---|
[0-9]{2,4} | ab123csde | 1 overeenkomst (overeenkomst op ab123csde ) |
12 and 345673 | 3 overeenkomsten (12 , 3456 , 73 ) | |
1 and 2 | Geen overeenkomst |
|
- Alternatief
Verticale balk |
wordt gebruikt voor afwisseling (or
operator).
Expressie | String | Overeenkomend? |
---|---|---|
a|b | cde | Geen overeenkomst |
ade | 1 overeenkomst (overeenkomst op ade ) | |
acdbea | 3 overeenkomsten (op acdbea ) |
Hier, a|b
match elke tekenreeks die a . bevat of b
()
- Groep
Haakjes ()
wordt gebruikt om subpatronen te groeperen. Bijvoorbeeld (a|b|c)xz
overeenkomen met elke tekenreeks die overeenkomt met a of b of c gevolgd door xz
Expressie | String | Overeenkomend? |
---|---|---|
(a|b|c)xz | ab xz | Geen overeenkomst |
abxz | 1 overeenkomst (overeenkomst op abxz ) | |
axz cabxz | 2 overeenkomsten (op axzbc cabxz ) |
\
- Backslash
Speling \
wordt gebruikt om te ontsnappen aan verschillende tekens, inclusief alle metatekens. Bijvoorbeeld,
\$a
match als een string $
. bevat gevolgd door a
. Hier, $
wordt niet op een speciale manier door een RegEx-engine geïnterpreteerd.
Als u niet zeker weet of een teken een speciale betekenis heeft of niet, kunt u \
voor. Dit zorgt ervoor dat het personage niet op een speciale manier wordt behandeld.
Speciale sequenties
Speciale reeksen maken veelgebruikte patronen gemakkelijker om te schrijven. Hier is een lijst met speciale sequenties:
\A
- Komt overeen als de opgegeven tekens aan het begin van een tekenreeks staan.
Expressie | String | Overeenkomend? |
---|---|---|
\Athe | the sun | Overeenkomst |
In the sun | Geen overeenkomst |
\b
- Komt overeen als de opgegeven tekens aan het begin of het einde van een woord staan.
Expressie | String | Overeenkomend? |
---|---|---|
\bfoo | football | Overeenkomst |
a football | Overeenkomst | |
afootball | Geen overeenkomst | |
foo\b | the foo | Overeenkomst |
the afoo test | Overeenkomst | |
the afootest | Geen overeenkomst |
\B
- Tegenover \b
. Komt overeen als de opgegeven tekens niet . zijn aan het begin of einde van een woord.
Expressie | String | Overeenkomend? |
---|---|---|
\Bfoo | football | Geen overeenkomst |
a football | Geen overeenkomst | |
afootball | Overeenkomst | |
foo\B | the foo | Geen overeenkomst |
the afoo test | Geen overeenkomst | |
the afootest | Overeenkomst |
\d
- Komt overeen met elk decimaal cijfer. Gelijk aan [0-9]
Expressie | String | Overeenkomend? |
---|---|---|
\d | 12abc3 | 3 overeenkomsten (op 12abc3 ) |
Python | Geen overeenkomst |
\D
- Komt overeen met elk niet-decimaal cijfer. Gelijk aan [^0-9]
Expressie | String | Overeenkomend? |
---|---|---|
\D | 1ab34"50 | 3 overeenkomsten (op 1ab34"50 ) |
1345 | Geen overeenkomst |
\s
- Komt overeen met waar een tekenreeks een witruimteteken bevat. Gelijk aan [ \t\n\r\f\v]
.
Expressie | String | Overeenkomend? |
---|---|---|
\s | Python RegEx | 1 overeenkomst |
PythonRegEx | Geen overeenkomst |
\S
- Komt overeen met waar een tekenreeks een niet-witruimteteken bevat. Gelijk aan [^ \t\n\r\f\v]
.
Expressie | String | Overeenkomend? |
---|---|---|
\S | a b | 2 overeenkomsten (op a b ) |
| Geen overeenkomst |
\w
- Komt overeen met elk alfanumeriek teken (cijfers en alfabetten). Gelijk aan [a-zA-Z0-9_]
. Trouwens, onderstreep _
wordt ook als een alfanumeriek teken beschouwd.
Expressie | String | Overeenkomend? |
---|---|---|
\w | 12&": ;c | 3 overeenkomsten (op 12&": ;c ) |
%"> ! | Geen overeenkomst |
\W
- Komt overeen met elk niet-alfanumeriek teken. Gelijk aan [^a-zA-Z0-9_]
Expressie | String | Overeenkomend? |
---|---|---|
\W | 1a2%c | 1 wedstrijd (op 1a2%c ) |
Python | Geen overeenkomst |
\Z
- Komt overeen als de opgegeven tekens aan het einde van een tekenreeks staan.
Expressie | String | Overeenkomend? |
---|---|---|
Python\Z | I like Python | 1 overeenkomst |
I like Python Programming | Geen overeenkomst | |
Python is fun. | Geen overeenkomst |
Tip: Om reguliere expressies te bouwen en te testen, kunt u RegEx-testertools zoals regex101 gebruiken. Deze tool helpt je niet alleen bij het maken van reguliere expressies, maar het helpt je ook om het te leren.
Nu u de basis van RegEx begrijpt, gaan we bespreken hoe u RegEx in uw Python-code kunt gebruiken.
Python RegEx
Python heeft een module met de naam re
werken met reguliere expressies. Om het te gebruiken, moeten we de module importeren.
import re
De module definieert verschillende functies en constanten om met RegEx te werken.
re.findall()
De re.findall()
methode retourneert een lijst met tekenreeksen die alle overeenkomsten bevat.
Voorbeeld 1:re.findall()
# Program to extract numbers from a string
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)
# Output: ['12', '89', '34']
Als het patroon niet wordt gevonden, re.findall()
geeft een lege lijst terug.
re.split()
De re.split
methode splitst de tekenreeks waar er een overeenkomst is en retourneert een lijst met tekenreeksen waar de splitsingen hebben plaatsgevonden.
Voorbeeld 2:re.split()
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
# Output: ['Twelve:', ' Eighty nine:', '.']
Als het patroon niet wordt gevonden, re.split()
geeft een lijst terug die de originele string bevat.
U kunt slagen voor maxsplit
argument voor de re.split()
methode. Het is het maximale aantal splitsingen dat zal plaatsvinden.
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# maxsplit = 1
# split only at the first occurrence
result = re.split(pattern, string, 1)
print(result)
# Output: ['Twelve:', ' Eighty nine:89 Nine:9.']
Trouwens, de standaardwaarde van maxsplit
is 0; wat alle mogelijke splitsingen betekent.
re.sub()
De syntaxis van re.sub()
is:
re.sub(pattern, replace, string)
De methode retourneert een tekenreeks waarbij overeenkomende exemplaren worden vervangen door de inhoud van replace variabel.
Voorbeeld 3:re.sub()
# Program to remove all whitespaces
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
# empty string
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
# Output: abc12de23f456
Als het patroon niet wordt gevonden, re.sub()
geeft de originele string terug.
Je kunt telling doorgeven als vierde parameter voor de re.sub()
methode. Indien weggelaten, resulteert dit in 0. Dit vervangt alle instanties.
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
# Output:
# abc12de 23
# f45 6
re.subn()
De re.subn()
lijkt op re.sub()
behalve dat het een tuple van 2 items retourneert die de nieuwe string en het aantal gemaakte vervangingen bevatten.
Voorbeeld 4:re.subn()
# Program to remove all whitespaces
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
# empty string
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
# Output: ('abc12de23f456', 4)
re.search()
De re.search()
methode heeft twee argumenten:een patroon en een string. De methode zoekt naar de eerste locatie waar het RegEx-patroon een overeenkomst met de tekenreeks produceert.
Als de zoekopdracht succesvol is, re.search()
retourneert een match-object; zo niet, dan retourneert het None
.
match = re.search(pattern, str)
Voorbeeld 5:re.search()
import re
string = "Python is fun"
# check if 'Python' is at the beginning
match = re.search('\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# Output: pattern found inside the string
Hier, overeenkomst bevat een match-object.
Overeenkomen met object
U kunt methoden en attributen van een match-object verkrijgen met de dir()-functie.
Enkele veelgebruikte methoden en attributen van matchobjecten zijn:
match.group()
De group()
methode retourneert het deel van de tekenreeks waar een overeenkomst is.
Voorbeeld 6:Match object
import re
string = '39801 356, 2102 1111'
# Three digit number followed by space followed by two digit number
pattern = '(\d{3}) (\d{2})'
# match variable contains a Match object.
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("pattern not found")
# Output: 801 35
Hier, overeenkomst variabele bevat een match-object.
Ons patroon (\d{3}) (\d{2})
heeft twee subgroepen (\d{3})
en (\d{2})
. U kunt het deel van de tekenreeks van deze subgroepen tussen haakjes krijgen. Dit is hoe:
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.group(1, 2)
('801', '35')
>>> match.groups()
('801', '35')
match.start(), match.end() en match.span()
De start()
functie retourneert de index van het begin van de overeenkomende subtekenreeks. Evenzo, end()
geeft de eindindex van de overeenkomende subtekenreeks terug.
>>> match.start()
2
>>> match.end()
8
De span()
functie retourneert een tuple die de begin- en eindindex van het overeenkomende deel bevat.
>>> match.span()
(2, 8)
match.re en match.string
De re
attribuut van een overeenkomend object retourneert een reguliere expressie-object. Evenzo, string
attribuut geeft de doorgegeven string terug.
>>> match.re
re.compile('(\\d{3}) (\\d{2})')
>>> match.string
'39801 356, 2102 1111'
We hebben alle veelgebruikte methoden behandeld die zijn gedefinieerd in de re
module. Als je meer wilt weten, bezoek dan Python 3 re module.
Het voorvoegsel r gebruiken vóór RegEx
Wanneer r of R prefix wordt gebruikt voor een reguliere expressie, het betekent onbewerkte tekenreeks. Bijvoorbeeld '\n'
is een nieuwe regel terwijl r'\n'
betekent twee tekens:een backslash \
gevolgd door n
.
Speling \
wordt gebruikt om te ontsnappen aan verschillende tekens, inclusief alle metatekens. Echter, met behulp van r voorvoegsel maakt \
behandelen als een normaal personage.
Voorbeeld 7:Onbewerkte tekenreeks met prefix r
import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)
# Output: ['\n', '\r']
Python