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.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
Í þ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
- Takmarkað við ASCII stafi:
- Gráðugar og ógráðugar eldspýtur
- Settu saman reglubundna tjáningarmynstrið: compile()
- passa við hlut
- Athugaðu hvort byrjun strengs passi, dragðu út: match()
- Athugaðu hvort samsvörun sé ekki takmörkuð við upphafið, dragið út: leit()
- 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ð reglulegum tjáningarmynstri: split()
- Venjuleg tjáning metastafir, sérstakar raðir og fyrirvarar í Python
- Að setja 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.
\1 | Fyrsti svigurinn |
\2 | Annar 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óna | innihald |
---|---|
. | 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 ~n endurtaka |
[] | Sett af persónum[] Passar við einhverja af þessum persónum |
| | EÐAA|B Passar annað hvort A eða B mynstur |
sérstök röð | innihald |
---|---|
\d | Unicode aukastafir (takmörkuð við ASCII tölur með ASCII fána) |
\D | \d Að meina hið gagnstæða við þetta. |
\s | Unicode hvítbilsstafir (takmörkuð við ASCII hvítbilstafi með ASCII fána) |
\S | \s Að meina hið gagnstæða við þetta. |
\w | Unicode orðstafir og undirstrik (takmörkuð við ASCII bókstafi og undirstrik með ASCII fána) |
\W | \w Að 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.IGNORECASE
Ef þ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öfun
re.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.MULTILINE
Ef þú 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öfun
re.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.