Jinsi ya kutumia moduli ya kawaida ya kujieleza ya Python (mechi, tafuta, ndogo, nk)

Biashara

Ili kufanya usindikaji wa kawaida wa kujieleza katika Python, tunatumia moduli ya re kutoka kwa maktaba ya kawaida. Inakuruhusu kutoa, kubadilisha, na kugawanya mifuatano kwa kutumia ruwaza za kawaida za kujieleza.

Katika sehemu hii, tutaelezea kwanza kazi na mbinu za moduli ya re.

  • Kukusanya mifumo ya kujieleza ya kawaida:compile()
  • mechi kitu
  • Angalia ikiwa mwanzo wa kamba unalingana, toa:match()
  • Angalia kwa zinazolingana sio tu za mwanzo:search()
  • Angalia ikiwa kamba nzima inalingana:fullmatch()
  • Pata orodha ya sehemu zote zinazolingana:findall()
  • Pata sehemu zote zinazolingana kama kiboreshaji:finditer()
  • Badilisha sehemu inayolingana:sub(),subn()
  • Kugawanya kamba kwa mifumo ya kawaida ya kujieleza:split()

Baada ya hayo, nitaelezea wahusika wa meta (wahusika maalum) na mlolongo maalum wa maneno ya kawaida ambayo yanaweza kutumika katika moduli ya re. Kimsingi, ni sintaksia ya kawaida ya usemi, lakini kuwa mwangalifu kuhusu kuweka bendera (hasa re.ASCII).

  • Metacharacter za kujieleza mara kwa mara, mfuatano maalum, na mapango katika Python
  • Kuweka bendera
    • Kikomo kwa herufi za ASCII:re.ASCII
    • Sio nyeti kwa kesi:re.IGNORECASE
    • Linganisha mwanzo na mwisho wa kila mstari:re.MULTILINE
    • Bainisha bendera nyingi
  • Mechi za uchoyo na zisizo za uchoyo

Kusanya muundo wa kawaida wa kujieleza: compile()

Kuna njia mbili za kufanya usindikaji wa kujieleza mara kwa mara kwenye moduli ya re.

Endesha na kitendakazi

Ya kwanza ni utendaji.re.match(),re.sub()Kazi kama hizi zinapatikana ili kutoa, kubadilisha, na michakato mingine kwa kutumia mifumo ya kawaida ya kujieleza.

Maelezo ya kazi yataelezwa baadaye, lakini katika yote, hoja ya kwanza ni kamba ya muundo wa kawaida wa kujieleza, ikifuatiwa na kamba ya kusindika na kadhalika. Kwa mfano, katika re.sub(), ambayo hufanya ubadilishanaji, hoja ya pili ni mfuatano wa kubadilisha, na hoja ya tatu ni mfuatano wa kuchakatwa.

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

Kumbuka kuwa [a-z] katika muundo wa kawaida wa usemi katika mfano huu unamaanisha herufi yoyote kutoka a hadi z (yaani herufi ndogo), na + inamaanisha kurudia muundo uliotangulia (katika kesi hii [a-z]) mara moja au zaidi. [a-z]+ inalingana na mfuatano wowote unaorudia herufi moja au zaidi za herufi ndogo.

. ni mhusika meta (mhusika aliye na maana maalum) na lazima aepukwe kwa kurudisha nyuma.

Kwa kuwa kamba za muundo wa usemi wa kawaida mara nyingi hutumia mikwaruzo mingi, ni rahisi kutumia nyuzi mbichi kama ilivyo kwenye mfano.

Huendesha kwa njia ya kipengee cha muundo wa kawaida wa kujieleza

Njia ya pili ya kuchakata misemo ya kawaida katika moduli ya upya ni mbinu ya kiolwa cha kawaida cha kujieleza.

Kwa kutumia re.compile(), unaweza kukusanya mfuatano wa mfuatano wa kawaida wa usemi ili kuunda kipengee cha muundo wa kawaida wa kujieleza.

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()Kwa mfano, mchakato sawa na utendakazi huu unaweza kutekelezwa kama mbinu match(),sub() ya vipengee vya kujieleza vya kawaida.

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

Kazi zote za re.xxx() zilizofafanuliwa hapa chini pia zimetolewa kama mbinu za kitu cha kawaida cha kujieleza.

Ikiwa unarudia mchakato unaotumia muundo sawa, ni bora zaidi kutengeneza kitu cha kawaida cha kujieleza na re.compile() na kukitumia kote.

Katika nambari ifuatayo ya sampuli, chaguo la kukokotoa linatumika bila kutayarisha kwa urahisi, lakini ikiwa unataka kutumia muundo huo mara kwa mara, inashauriwa kuikusanya mapema na kuitekeleza kama njia ya kitu cha kawaida cha kujieleza.

mechi kitu

match(), tafuta(), n.k. rudisha kitu kinacholingana.

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'>

Kamba na msimamo unaofanana hupatikana kwa kutumia mbinu zifuatazo za kitu cha mechi.

  • Pata eneo la mechi:start(),end(),span()
  • Pata safu inayolingana:group()
  • Pata kamba kwa kila kikundi:groups()
print(m.start())
# 0

print(m.end())
# 11

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

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

Ukiambatanisha sehemu ya muundo wa kawaida wa kujieleza katika mfuatano wenye mabano(), sehemu hiyo itachakatwa kama kikundi. Katika kesi hii, safu ya sehemu inayolingana na kila kikundi katika vikundi () inaweza kupatikana kama nakala.

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')

Angalia ikiwa mwanzo wa kamba unalingana, toa: match()

match() inarudisha kitu cha mechi ikiwa mwanzo wa kamba unalingana na muundo.

Kama ilivyotajwa hapo juu, kitu cha kulinganisha kinaweza kutumika kutoa kamba ndogo inayolingana, au kuangalia tu ikiwa mechi ilitengenezwa.

match() itaangalia mwanzo tu. Ikiwa hakuna kamba inayolingana mwanzoni, itarudisha Hakuna.

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

Angalia kwa zinazolingana sio tu za mwanzo, dondoo: search()

Kama match(), inarudisha kitu cha mechi ikiwa inalingana.

Ikiwa kuna sehemu nyingi zinazolingana, ni sehemu ya kwanza pekee inayolingana ndiyo itarejeshwa.

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'>

Ikiwa unataka kupata sehemu zote zinazolingana, tumia findall() au finditer() kama ilivyoelezewa hapa chini.

Angalia ikiwa kamba nzima inalingana: fullmatch()

Ili kuangalia ikiwa mfuatano wote unalingana na muundo wa kawaida wa kujieleza, tumia fullmatch(). Hii ni muhimu, kwa mfano, kuangalia kama mfuatano ni halali kama barua pepe au la.

Ikiwa mfuatano wote unalingana, kitu kinacholingana kinarejeshwa.

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'>

Ikiwa kuna sehemu ambazo hazijalinganishwa (sehemu ya sehemu tu inayolingana au hakuna inayolingana kabisa), Hakuna inayorejeshwa.

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

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

Fullmatch() iliongezwa katika Python 3.4. Ikiwa unataka kufanya vivyo hivyo katika matoleo ya awali, tumia match() na meta inayolingana na herufi $ mwishoni. Ikiwa mfuatano wote kuanzia mwanzo hadi mwisho haulingani, utarudi Hakuna.

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

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

Pata orodha ya sehemu zote zinazolingana: findall()

findall() inarudisha orodha ya mifuatano yote inayolingana. Kumbuka kuwa vipengee vya orodha havilingani na vitu bali ni kamba.

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']

Idadi ya sehemu zinazolingana zinaweza kuangaliwa kwa kutumia kitendakazi kilichojengwa ndani len(), ambacho kinarudisha idadi ya vipengee kwenye orodha.

print(len(result))
# 3

Kupanga pamoja na mabano() katika muundo wa usemi wa kawaida hurejesha orodha ya nakala ambazo vipengele vyake ni mifuatano ya kila kikundi. Hii ni sawa na groups() kwenye kitu cha mechi.

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

Mabano ya kikundi () yanaweza kuwekewa kiota, kwa hivyo ikiwa unataka kupata mechi nzima pia, ambatisha mechi nzima kwenye mabano ().

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')]

Ikiwa hakuna mechi inayopatikana, nakala tupu inarudishwa.

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

Pata sehemu zote zinazolingana kama kiboreshaji: finditer()

finditer() inarudisha sehemu zote zinazolingana kama kiboreshaji. Vipengee sio kamba kama findall(), lakini vitu vya kulinganisha, kwa hivyo unaweza kupata msimamo (index) ya sehemu zinazolingana.

Kirudishi chenyewe hakiwezi kuchapishwa na print() kupata yaliyomo. Ikiwa unatumia kazi iliyojengwa ndani next() au kwa taarifa, unaweza kupata yaliyomo moja baada ya nyingine.

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'>

Inaweza pia kubadilishwa kuwa orodha iliyo na 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)

Ikiwa unataka kupata nafasi ya sehemu zote zinazolingana, nukuu ya ufahamu wa orodha ni rahisi zaidi kuliko list().

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

Kirudia huchukua vipengele kwa mpangilio. Kumbuka kwamba ukijaribu kutoa vipengele zaidi baada ya kufikia mwisho, utaachwa bila chochote.

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))
# []

Badilisha sehemu zinazolingana: ndogo (), subn ()

Kwa kutumia sub(), unaweza kubadilisha sehemu inayolingana na kamba nyingine. Mfuatano uliobadilishwa utarejeshwa.

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'>

Wakati wa kupanga na mabano (), kamba inayolingana inaweza kutumika katika kamba iliyobadilishwa.

Kwa chaguo-msingi, yafuatayo yanaauniwa: Kumbuka kwamba kwa mifuatano ya kawaida ambayo si nyuzi mbichi, msukosuko wa nyuma lazima uorodheshwe kabla ya msukosuko ili kuepuka mikwaruzo.

\1Mabano ya kwanza
\2Mabano ya pili
\3Mabano ya tatu
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>
Ukitaja kikundi kwa kuandika hili mwanzoni mwa mabano ya muundo wa usemi wa kawaida, unaweza kubainisha kwa kutumia jina badala ya nambari, kama inavyoonyeshwa hapa chini.
\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

Hesabu ya hoja hubainisha idadi ya juu zaidi ya uingizwaji. Hesabu tu kutoka upande wa kushoto itabadilishwa.

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() hurejesha nakala ya mfuatano uliobadilishwa (sawa na thamani ya kurejesha ya sub()) na idadi ya sehemu zilizobadilishwa (nambari inayolingana na mchoro).

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

Mbinu ya kubainisha hoja ni sawa na sub(). Unaweza kutumia sehemu iliyopangwa kwa mabano, au kutaja hesabu ya hoja.

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)

Kugawanya kamba na mifumo ya kawaida ya kujieleza: split()

split() hugawanya kamba kwenye sehemu inayolingana na muundo, na kuirudisha kama orodha.

Kumbuka kuwa mechi ya kwanza na ya mwisho itakuwa na mifuatano tupu mwanzoni na mwisho wa orodha inayotokana.

s = '111aaa222bbb333'

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

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

Hoja ya mgawanyiko mkubwa inabainisha idadi ya juu zaidi ya mgawanyiko (vipande). Hesabu kutoka upande wa kushoto pekee ndiyo itagawanywa.

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

Metacharacter za kujieleza mara kwa mara, mfuatano maalum, na mapango katika Python

Wahusika wakuu wa usemi wa kawaida wa meta (herufi maalum) na mlolongo maalum ambao unaweza kutumika kwenye moduli ya Python 3 re ni kama ifuatavyo.

methaliyaliyomo
.Herufi yoyote isipokuwa laini mpya (pamoja na laini mpya iliyo na bendera ya DOTALL)
^Mwanzo wa kamba (pia inalingana na mwanzo wa kila mstari na bendera ya MULTILINE)
$Mwisho wa mfuatano (pia unalingana na mwisho wa kila mstari na bendera ya MULTILINE)
*Rudia muundo uliopita zaidi ya mara 0
+Rudia muundo uliopita angalau mara moja.
?Rudia muundo uliopita 0 au mara 1
{m}Rudia muundo uliopita mara m
{m, n}Mchoro wa mwisho.m~nkurudia
[]Seti ya wahusika[]Inalingana na mojawapo ya wahusika hawa
|AUA|BInalingana na muundo wa A au B
mlolongo maalumyaliyomo
\dNambari za desimali za Unicode (zinazowekwa kwa nambari za ASCII na bendera ya ASCII)
\D\dMaana yake ni kinyume cha hili.
\sVibambo vya nafasi nyeupe za Unicode (zinazopunguzwa kwa herufi za nafasi nyeupe za ASCII na bendera ya ASCII)
\S\sMaana yake ni kinyume cha hili.
\wVibambo vya maneno vya Unicode na mistari ya chini (imezuiliwa kwa herufi za alphanumeric za ASCII na miktari kwa bendera ya ASCII)
\W\wMaana yake ni kinyume cha hili.

Sio zote zimeorodheshwa kwenye jedwali hili. Tazama hati rasmi kwa orodha kamili.

Pia kumbuka kuwa baadhi ya maana ni tofauti katika Python 2.

Kuweka bendera

Kama inavyoonyeshwa kwenye jedwali hapo juu, baadhi ya herufi za meta na mfuatano maalum hubadilisha hali yao kulingana na bendera.

Bendera kuu pekee ndizo zimefunikwa hapa. Tazama hati rasmi kwa zingine.

Kikomo kwa herufi za ASCII: re.ASCII

\wHii pia italingana na kanji ya baiti mbili, herufi na nambari, n.k. kwa chaguo-msingi kwa mifuatano 3 ya Python. Sio sawa na ifuatayo kwa sababu sio usemi wa kawaida wa kawaida.[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

Ukibainisha re.ASCII kwa bendera za hoja katika kila chaguo la kukokotoa, au kuongeza alama ya mstari ifuatayo mwanzoni mwa mfuatano wa mfuatano wa kawaida wa usemi, italingana na vibambo vya ASCII pekee (haitalingana na herufi mbili za Kijapani, alphanumeric, n.k. .).
(?a)
Katika kesi hii, mbili zifuatazo ni sawa.
\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

Hali hiyo hiyo inatumika wakati wa kuandaa na re.compile(). Tumia bendera za hoja au bendera za ndani.

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 inapatikana pia kama fomu fupi re. A. Unaweza kutumia aidha.

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

\W, kinyume cha \W, pia huathiriwa na re.ASCII na bendera za ndani.

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'>

Kama ilivyo kwa \w, mbili zifuatazo zinalingana na herufi za baiti moja na baiti mbili kwa chaguomsingi, lakini zimezuiwa kwa herufi za baiti moja ikiwa bendera za re.ASCII au za ndani zimebainishwa.

  • Linganisha nambari\d
  • Inalingana na nafasi tupu\s
  • Inalingana na zisizo nambari\D
  • Inalingana na zisizo za nafasi.\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

Sio nyeti kwa kesi:re.IGNORECASE

Kwa chaguo-msingi, ni nyeti kwa kesi. Ili kulinganisha zote mbili, unahitaji kujumuisha herufi kubwa na ndogo katika muundo.

re.IGNORECASEIkiwa hii imebainishwa, italingana na kesi bila kujali. Sawa na bendera ya i katika misemo ya kawaida ya kawaida.

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'>

Unaweza kutumia chini ya au sawa na.

  • bendera ya ndani(?i)
  • ufupishore.I

Linganisha mwanzo na mwisho wa kila mstari:re.MULTILINE

^Vibambo vya meta katika usemi huu wa kawaida vinalingana na mwanzo wa mfuatano.

Kwa chaguo-msingi, mwanzo tu wa kamba nzima unalingana, lakini zifuatazo zitafanana na mwanzo wa kila mstari pia. Sawa na bendera ya m katika misemo ya kawaida ya kawaida.
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']

$Inalingana na mwisho wa kamba. Kwa chaguo-msingi, mwisho wa kamba nzima tu ndio unaolingana.
re.MULTILINEUkibainisha hili, itafanana pia na mwisho wa kila mstari.

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

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

Unaweza kutumia chini ya au sawa na.

  • bendera ya ndani(?m)
  • ufupishore.M

Bainisha bendera nyingi

|Ikiwa unataka kuwezesha bendera nyingi kwa wakati mmoja, tumia hii. Kwa upande wa bendera za ndani, kila herufi lazima ifuatwe na herufi kama inavyoonyeshwa hapa chini.
(?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']

Mechi za uchoyo na zisizo za uchoyo

Hili ni shida ya jumla na misemo ya kawaida, sio shida na Python tu, lakini nitaandika juu yake kwa sababu inaelekea kuniingiza kwenye shida.

Kwa chaguo-msingi, ifuatayo ni mechi ya tamaa, ambayo inafanana na kamba ndefu zaidi iwezekanavyo.

  • *
  • +
  • ?
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

Je! baada ya itasababisha mechi isiyo na tamaa, ndogo, inayofanana na kamba fupi iwezekanavyo.

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

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

Kumbuka kuwa ulinganifu chaguo-msingi wa pupa unaweza kuendana na mifuatano isiyotarajiwa.

Copied title and URL