Hvernig á að nota Python reglulegu tjáningareininguna re (samsvörun, leit, undir osfrv.)

Viðskipti

Til að framkvæma reglubundna tjáningarvinnslu í Python notum við re-eininguna frá venjulegu bókasafninu. Það gerir þér kleift að draga út, skipta út og skipta strengjum með því að nota regluleg tjáningarmynstur.

Í þessum hluta munum við fyrst útskýra aðgerðir og aðferðir endureiningarinnar.

  • Að setja saman mynstur fyrir reglubundna tjáningu:compile()
  • passa við hlut
  • Athugaðu hvort byrjun strengsins passi, dragðu út:match()
  • Athugaðu hvort samsvörun sé ekki takmörkuð við upphafið:search()
  • Athugaðu hvort allur strengurinn passi:fullmatch()
  • Fáðu lista yfir alla samsvarandi hluta:findall()
  • Fáðu alla samsvarandi hluta sem endurtekningu:finditer()
  • Skiptu um samsvarandi hluta:sub(),subn()
  • Að skipta strengjum með reglulegu tjáningarmynstri:split()

Eftir það mun ég útskýra meta-stafina (sérstafi) og sérstakar raðir reglulegra tjáninga sem hægt er að nota í re-einingunni. Í grundvallaratriðum er það staðlað setningafræði reglulegra tjáningar, en vertu varkár með að setja fána (sérstaklega re.ASCII).

  • Venjuleg tjáning metastafir, sérstakar raðir og fyrirvarar í Python
  • Að setja fána
    • Takmarkað við ASCII stafi:re.ASCII
    • Ekki hástafaviðkvæmir:re.IGNORECASE
    • Passaðu upphaf og lok hverrar línu:re.MULTILINE
    • Tilgreindu marga fána
  • Gráðugar og ógráðugar eldspýtur

Settu saman reglubundna tjáningarmynstrið: compile()

Það eru tvær leiðir til að framkvæma reglulegar tjáningarvinnslu í endureiningunni.

Keyra með virkni

Hið fyrra er fall.re.match(),re.sub()Aðgerðir eins og þessar eru tiltækar til að framkvæma útdrátt, endurnýjun og önnur ferli með því að nota regluleg tjáningarmynstur.

Nánar verður sagt frá aðgerðunum síðar, en í þeim öllum er fyrsta röksemdin strengur reglulegrar tjáningarmynstrsins, síðan strengurinn sem á að vinna úr og svo framvegis. Til dæmis, í re.sub(), sem framkvæmir útskiptingu, er önnur viðfangið skiptistrengurinn og þriðja viðmiðið er strengurinn sem á að vinna úr.

import re

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.match(r'([a-z]+)@([a-z]+)\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

result = re.sub(r'([a-z]+)@([a-z]+)\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

Athugaðu að [a-z] í reglulegu tjáningarmynstrinu í þessu dæmi þýðir hvaða staf sem er frá a til ö (þ.e. lágstafi), og + þýðir að endurtaka fyrra mynstur (í þessu tilfelli [a-z]) einu sinni eða oftar. [a-z]+ passar við hvaða streng sem er sem endurtekur einn eða fleiri lágstafi í stafrófinu.

. er metapersóna (persóna með sérstaka merkingu) og verður að sleppa honum með skástrik.

Þar sem mynsturstrengir með reglubundnum tjáningum nota oft mikið af bakskástrikum er þægilegt að nota hráa strengi eins og í dæminu.

Keyrir í aðferð við mynsturhlut með reglulegri tjáningu

Önnur leiðin til að vinna úr reglulegum tjáningum í re-einingunni er reglubundin tjáningarmynsturhlutur.

Með því að nota re.compile() geturðu sett saman reglubundið tjáningarmynsturstreng til að búa til reglubundið tjáningarmynsturhlut.

p = re.compile(r'([a-z]+)@([a-z]+)\.com')

print(p)
# re.compile('([a-z]+)@([a-z]+)\\.com')

print(type(p))
# <class 're.Pattern'>

re.match(),re.sub()Til dæmis er hægt að framkvæma sama ferli og þessar aðgerðir þar sem aðferðir passa(),sub() reglulegra tjáningarhluta.

m = p.match(s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

result = p.sub('new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

Allar re.xxx() aðgerðir sem lýst er hér að neðan eru einnig gefnar upp sem aðferðir við reglubundið tjáningarhlutinn.

Ef þú ert að endurtaka ferli sem notar sama mynstur er skilvirkara að búa til reglubundinn tjáningarhlut með re.compile() og nota hann í kring.

Í eftirfarandi sýnishornskóða er aðgerðin notuð án þess að setja saman til hægðarauka, en ef þú vilt nota sama mynstrið ítrekað er mælt með því að setja það saman fyrirfram og framkvæma það sem aðferð við reglubundinn tjáningarhlut.

passa við hlut

match(), leit() osfrv. skila samsvarandi hlut.

s = 'aaa@xxx.com'

m = re.match(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(type(m))
# <class 're.Match'>

Samsvörun strengurinn og staðsetningin eru fengin með því að nota eftirfarandi aðferðir við samsvörunarhlutinn.

  • Fáðu staðsetningu leiksins:start(),end(),span()
  • Fáðu samsvarandi streng:group()
  • Fáðu strenginn fyrir hvern hóp:groups()
print(m.start())
# 0

print(m.end())
# 11

print(m.span())
# (0, 11)

print(m.group())
# aaa@xxx.com

Ef þú setur hluta af venjulegu tjáningarmynstri inn í streng með sviga() verður hluturinn unninn sem hópur. Í þessu tilviki er hægt að fá streng hlutans sem passar við hvern hóp í hópum() sem tuple.

m = re.match(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(m.groups())
# ('aaa', 'xxx', 'com')

Athugaðu hvort byrjun strengs passi, dragðu út: match()

match() skilar samsvörunarhlut ef byrjun strengsins passar við mynstrið.

Eins og getið er hér að ofan er hægt að nota samsvörunarhlutinn til að draga út samsvarandi undirstrenginn, eða einfaldlega til að athuga hvort samsvörun hafi verið gerð.

match() mun aðeins athuga byrjunina. Ef það er enginn samsvarandi strengur í upphafi skilar hann Engu.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.match(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

m = re.match(r'[a-z]+@[a-z]+\.net', s)
print(m)
# None

Athugaðu hvort samsvörun sé ekki takmörkuð við upphafið, dragið út: leit()

Eins og match() skilar það samsvörunarhlut ef hann passar.

Ef það eru margir samsvörunarhlutar verður aðeins fyrsti samsvöruninni skilað.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.search(r'[a-z]+@[a-z]+\.net', s)
print(m)
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

m = re.search(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

Ef þú vilt fá alla samsvarandi hluta, notaðu findall() eða finditer() eins og lýst er hér að neðan.

Athugaðu hvort allur strengurinn passi: fullmatch()

Til að athuga hvort allur strengurinn passi við venjulegu tjáningarmynstrið, notaðu fullmatch(). Þetta er til dæmis gagnlegt til að athuga hvort strengur sé gildur sem netfang eða ekki.

Ef allur strengurinn passar er samsvarandi hlutur skilað.

s = 'aaa@xxx.com'

m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

Ef það eru ósamþykktir hlutar (aðeins hlutar samsvörun eða engar samsvörun) er Engum skilað.

s = '!!!aaa@xxx.com!!!'

m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None

Fullmatch() var bætt við í Python 3.4. Ef þú vilt gera það sama í fyrri útgáfum, notaðu match() og samsvarandi metastaf $ í lokin. Ef allur strengurinn frá upphafi til enda passar ekki, skilar hann Engu.

s = '!!!aaa@xxx.com!!!'

m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None

Fáðu lista yfir alla samsvarandi hluta: findall()

findall() skilar lista yfir alla samsvarandi undirstrengi. Athugaðu að þættir listans eru ekki samsvörunarhlutir heldur strengir.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.findall(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# ['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.net']

Hægt er að athuga fjölda samsvarandi hluta með því að nota innbyggða fallið len(), sem skilar fjölda staka á listanum.

print(len(result))
# 3

Flokkun með svigum() í reglulegu tjáningarmynstri skilar lista yfir túlla þar sem þættirnir eru strengir hvers hóps. Þetta jafngildir hópum() í samsvörunarhlutnum.

result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]

Hægt er að hreiðra hópsvigana () þannig að ef þú vilt fá alla samsvörunina líka skaltu bara setja alla samsvörunina innan sviga ().

result = re.findall(r'(([a-z]+)@([a-z]+)\.([a-z]+))', s)
print(result)
# [('aaa@xxx.com', 'aaa', 'xxx', 'com'), ('bbb@yyy.com', 'bbb', 'yyy', 'com'), ('ccc@zzz.net', 'ccc', 'zzz', 'net')]

Ef engin samsvörun finnst, er tómum túpeli skilað.

result = re.findall('[0-9]+', s)
print(result)
# []

Fáðu alla samsvarandi hluta sem endurtekningu: finditer()

finditer() skilar öllum samsvarandi hlutum sem endurtekningu. Þættirnir eru ekki strengir eins og findall(), heldur passa hluti, svo þú getur fengið staðsetningu (vísitölu) pöruðu hlutanna.

Ekki er hægt að prenta út endurtekið sjálft með print() til að fá innihald hans. Ef þú notar innbyggðu fallið next() eða for yfirlýsinguna geturðu fengið innihaldið eitt af öðru.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# <callable_iterator object at 0x10b0efa90>

print(type(result))
# <class 'callable_iterator'>

for m in result:
    print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

Það er líka hægt að breyta því í lista með list().

l = list(re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s))
print(l)
# [<re.Match object; span=(0, 11), match='aaa@xxx.com'>, <re.Match object; span=(13, 24), match='bbb@yyy.com'>, <re.Match object; span=(26, 37), match='ccc@zzz.net'>]

print(l[0])
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(type(l[0]))
# <class 're.Match'>

print(l[0].span())
# (0, 11)

Ef þú vilt fá staðsetningu allra samsvarandi hluta, er listaskilningurinn þægilegri en list().

print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]

Ítrekarinn tekur út þætti í röð. Athugaðu að ef þú reynir að draga út fleiri þætti eftir að þú hefur náð endanum muntu ekki sitja eftir með ekkert.

result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)

for m in result:
    print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

print(list(result))
# []

Skiptu um samsvarandi hluta: sub(), subn()

Með því að nota sub() geturðu skipt út samsvarandi hlutanum fyrir annan streng. Strengurinn sem skipt er um verður skilað.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

print(type(result))
# <class 'str'>

Þegar flokkað er með sviga() er hægt að nota samsvarandi strenginn í strengnum sem skipt er út.

Sjálfgefið er eftirfarandi studd: Athugaðu að fyrir venjulega strengi sem eru ekki hráir strengir, verður að skrá bakskástrik á undan bakskástrikinu til að sleppa við bakskásturinn.

\1Fyrsti svigurinn
\2Annar svigurinn
\3Þriðji svigurinn
result = re.sub(r'([a-z]+)@([a-z]+)\.com', r'\1@\2.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net

?P<xxx>
Ef þú nefnir hópinn með því að skrifa þetta í byrjun svigamynstrsins í reglulegu tjáningarmynstrinu geturðu tilgreint það með því að nota nafnið í stað númersins, eins og sýnt er hér að neðan.
\g<xxx>

result = re.sub(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net

Fjöldi rifrilda tilgreinir hámarksfjölda skipta. Aðeins talning frá vinstri hlið verður skipt út.

result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# new-address, bbb@yyy.com, ccc@zzz.net

subn() skilar tuple af setta strengnum (sama og skilagildi sub()) og fjölda skiptra hluta (talan sem passaði við mynstrið).

result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)

Aðferðin við að tilgreina rök er sú sama og undir(). Þú getur notað hlutann sem flokkaður er eftir sviga, eða tilgreint fjölda talna.

result = re.subn(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# ('aaa@xxx.net, bbb@yyy.net, ccc@zzz.net', 2)

result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# ('new-address, bbb@yyy.com, ccc@zzz.net', 1)

Að skipta strengjum með reglulegum tjáningarmynstri: split()

split() skiptir strengnum í hlutann sem passar við mynstrið og skilar honum sem lista.

Athugaðu að fyrsta og síðasta samsvörunin mun innihalda tóma strengi í upphafi og lok listans.

s = '111aaa222bbb333'

result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']

result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']

maxsplit rökin tilgreina hámarksfjölda skiptinga (stykki). Aðeins talningunni frá vinstri hlið verður skipt.

result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']

Venjuleg tjáning metastafir, sérstakar raðir og fyrirvarar í Python

Helstu metastafir reglulegra tjáningar (sérstafir) og sérraðir sem hægt er að nota í Python 3 re einingunni eru sem hér segir

metapersónainnihald
.Einhver stafur annar en nýlína (þar á meðal nýlína með DOTALL fánanum)
^Upphaf strengsins (passar einnig við upphaf hverrar línu við MULTILINE fána)
$Endir strengsins (passar líka við enda hverrar línu við MULTILINE fána)
*Endurtaktu fyrra mynstur oftar en 0 sinnum
+Endurtaktu fyrra mynstur að minnsta kosti einu sinni.
?Endurtaktu fyrra mynstur 0 eða 1 sinnum
{m}Endurtakið fyrra mynstur m sinnum
{m, n}Síðasta mynstur.m~nendurtaka
[]Sett af persónum[]Passar við einhverja af þessum persónum
|EÐAA|BPassar annað hvort A eða B mynstur
sérstök röðinnihald
\dUnicode aukastafir (takmörkuð við ASCII tölur með ASCII fána)
\D\dAð meina hið gagnstæða við þetta.
\sUnicode hvítbilsstafir (takmörkuð við ASCII hvítbilstafi með ASCII fána)
\S\sAð meina hið gagnstæða við þetta.
\wUnicode orðstafir og undirstrik (takmörkuð við ASCII bókstafi og undirstrik með ASCII fána)
\W\wAð meina hið gagnstæða við þetta.

Þeir eru ekki allir taldir upp í þessari töflu. Sjá opinberu skjölin fyrir heildarlista.

Athugaðu einnig að sumar merkingar eru mismunandi í Python 2.

Að setja fána

Eins og sést í töflunni hér að ofan breyta sumir meta-stafir og sérraðir um ham eftir fánanum.

Hér er aðeins fjallað um helstu fánana. Sjá opinberu skjölin fyrir restina.

Takmarkað við ASCII stafi: re.ASCII

\wÞetta mun einnig passa við tvöfalda bæta kanji, tölustafi osfrv. sjálfgefið fyrir Python 3 strengi. Það jafngildir ekki eftirfarandi vegna þess að það er ekki venjuleg regluleg tjáning.[a-zA-Z0-9_]

m = re.match(r'\w+', '漢字ABC123')
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>

m = re.match('[a-zA-Z0-9_]+', '漢字ABC123')
print(m)
# None

Ef þú tilgreinir re.ASCII fyrir röksemdarfánana í hverri aðgerð, eða bætir eftirfarandi innbyggða fána við upphaf reglulegrar tjáningarmynsturstrengs, mun það aðeins passa við ASCII stafi (það mun ekki passa við tvöfalda bæta japönsku, tölustafi o.s.frv. .).
(?a)
Í þessu tilviki eru eftirfarandi tveir jafngildir.
\w#ERROR![a-zA-Z0-9_]

m = re.match(r'\w+', '漢字ABC123', flags=re.ASCII)
print(m)
# None

m = re.match(r'(?a)\w+', '漢字ABC123')
print(m)
# None

Sama á við þegar safnað er saman með re.compile(). Notaðu rökflögguna eða innbyggða fána.

p = re.compile(r'\w+', flags=re.ASCII)
print(p)
# re.compile('\\w+', re.ASCII)

print(p.match('漢字ABC123'))
# None

p = re.compile(r'(?a)\w+')
print(p)
# re.compile('(?a)\\w+', re.ASCII)

print(p.match('漢字ABC123'))
# None

ASCII er einnig fáanlegt sem stutt form með tilliti til. A. Þú getur notað annað hvort.

print(re.ASCII is re.A)
# True

\W, andstæða \W, er einnig fyrir áhrifum af re.ASCII og inline fánum.

m = re.match(r'\W+', '漢字ABC123')
print(m)
# None

m = re.match(r'\W+', '漢字ABC123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>

Eins og með \w, passa eftirfarandi tveir sjálfgefið bæði staka og tvöfalda stafi, en takmarkast við staka stafi ef re.ASCII eða inline fánar eru tilgreindir.

  • Passaðu tölurnar\d
  • Passar autt bil\s
  • Passar við ónúmer\D
  • Passar við hvaða bil sem er ekki.\S
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# None

m = re.match(r'\s+', ' ')  # full-width space
print(m)
# <re.Match object; span=(0, 1), match='\u3000'>

m = re.match(r'\s+', ' ', flags=re.ASCII)
print(m)
# None

Ekki hástafaviðkvæmir:re.IGNORECASE

Sjálfgefið er að það er há- og hástöfum. Til að passa við bæði þarftu að hafa bæði hástafi og lágstafi í mynstrinu.

re.IGNORECASEEf þetta er tilgreint mun það passa án hástöfum. Jafngildir i fánanum í venjulegum reglulegum segðum.

m = re.match('[a-zA-Z]+', 'abcABC')
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

m = re.match('[a-z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

m = re.match('[A-Z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

Þú getur notað minna en eða jafnt og.

  • innbyggður fániinnbyggður fáni(?i)
  • skammstöfunre.I

Passaðu upphaf og lok hverrar línu:re.MULTILINE

^Metastafirnir í þessari reglulegu tjáningu passa við upphaf strengsins.

Sjálfgefið er að aðeins byrjun alls strengsins er samsvörun, en eftirfarandi mun passa við upphaf hverrar línu líka. Jafngildir m fánanum í stöðluðum reglulegum segðum.
re.MULTILINE

s = '''aaa-xxx
bbb-yyy
ccc-zzz'''

print(s)
# aaa-xxx
# bbb-yyy
# ccc-zzz

result = re.findall('[a-z]+', s)
print(result)
# ['aaa', 'xxx', 'bbb', 'yyy', 'ccc', 'zzz']

result = re.findall('^[a-z]+', s)
print(result)
# ['aaa']

result = re.findall('^[a-z]+', s, flags=re.MULTILINE)
print(result)
# ['aaa', 'bbb', 'ccc']

$Passar við enda strengsins. Sjálfgefið er að aðeins endir alls strengsins sé samsvörun.
re.MULTILINEEf þú tilgreinir þetta mun það líka passa við lok hverrar línu.

result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']

result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']

Þú getur notað minna en eða jafnt og.

  • innbyggður fáni(?m)
  • skammstöfunre.M

Tilgreindu marga fána

|Ef þú vilt virkja marga fána á sama tíma, notaðu þetta. Ef um er að ræða innbyggða fána verður að fylgja hverjum staf eftir með staf eins og sýnt er hér að neðan.
(?am)

s = '''aaa-xxx
漢漢漢-字字字
bbb-zzz'''

print(s)
# aaa-xxx
# 漢漢漢-字字字
# bbb-zzz

result = re.findall(r'^\w+', s, flags=re.M)
print(result)
# ['aaa', '漢漢漢', 'bbb']

result = re.findall(r'^\w+', s, flags=re.M | re.A)
print(result)
# ['aaa', 'bbb']

result = re.findall(r'(?am)^\w+', s)
print(result)
# ['aaa', 'bbb']

Gráðugar og ógráðugar eldspýtur

Þetta er almennt vandamál með reglulegar tjáningar, ekki bara vandamál með Python, en ég mun skrifa um það vegna þess að það hefur tilhneigingu til að koma mér í vandræði.

Sjálfgefið er að eftirfarandi sé gráðugur samsvörun, sem passar við lengsta mögulega streng.

  • *
  • +
  • ?
s = 'aaa@xxx.com, bbb@yyy.com'

m = re.match(r'.+com', s)
print(m)
# <re.Match object; span=(0, 24), match='aaa@xxx.com, bbb@yyy.com'>

print(m.group())
# aaa@xxx.com, bbb@yyy.com

The ? eftir það mun leiða til gráðugra, lágmarks samsvörun, sem passar við stysta mögulega streng.

  • *?
  • +?
  • ??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(m.group())
# aaa@xxx.com

Athugaðu að sjálfgefna gráðuga samsvörunin gæti passað við óvænta strengi.