
python正則表達式group?法_【Python】正則表達式?法
導讀:正則在各語?中的使?是有差異的,本?以Python3為基礎。本?主要講述的是正則的語法,對于re模塊不做過多描述,只會對?些特殊地?做提?。
很多?覺得正則很難,在我看來,這些??定是沒有??。其實正則很簡單,根據(jù)??原則,我們只需要懂20%的內(nèi)容就可以解決80%
的問題了。我曾經(jīng)有?年?乎每天都跟正則打交道,剛接?項?的時候我對正則也是??所知,花半?時百度了?下,然后寫了?個
demo,就開始正式接?了。三年多時間,我?到的正則鮮有超出我最初半?時百度到的知識的。
1、正則基礎
1.1、基礎語法
(1)常?元字符
語法描述b
匹配單詞的開始或結束
d
匹配數(shù)字s
匹配任意不可見字符(空格、換?符、制表符等),等價于[fnrtv]。w
匹配任意Unicode字符集,包括字母、數(shù)字、下劃線、漢字等.
匹配除換?符(n)以外的任意字符^或A
匹配字符串或?的起始位置$或Z
匹配字符串或?的結束位置
(2)限定詞(?叫量詞)
語法描述*
重復零次或更多次+
重復?次或更多次
重復零次或?次
{n}
重復n次{n,}
重復n次或更多次{n,m}
重復n到m次
(3)常疫情防控人員 ?反義詞
語法描述B
匹配?單詞的開始或結束
D
匹配?數(shù)字S
匹配任意可見字符,[^fnrtv]W
匹配任意?Unicode字符集
除a、b、c以外的任意字符
(4)字符族
語法描述
[abc]a、b或c
除a、b、c以外的任意字符
[a-zA-Z]
a到z或A到Z[a-d[m-p]]
a到d或m到p,即[a-dm-假如我是風 p](并集)
[a-z&&[def]]
d、e或f(交集)[a-z&&[^bc]]
a到z,除了b和c:[ad-z](減去)[a-z&&[^m-p]]
a到z,減去m到p:[a-lq-z](減去)
以上便是正則的基礎內(nèi)容,下?來寫兩個例?看下:s='123abc你好'
('d+',s).group()
('w+',s).group()結果:
123
123abc你好是不是很簡單?
1.2、修飾符
修飾符在各語?中也是有差異的。
Python中的修飾符:
修飾符描述re.A
匹配ASCII字符類,影響w,W,b,B,d,D
re.I
忽略??寫re.L
做本地化識別匹配(這個極少極少使?)re.M
多?匹配,影響和re.S
使.匹配包括換?符(n)在內(nèi)的所有字符re.U
匹配Unicode字符集。與re.A相對,這是默認設置re.X
忽略空格和#后?的注釋以獲得看起來更易懂的正則。(1)re.A
修飾符A使w只匹配ASCII字符,W匹配?ASCII字符。s='123abc你好'
('w+',s,re.A).group()
('W+',s,re.A).group()
結果:
123abc你好
但是描述中還有d和D,數(shù)試卷反思怎么寫 字不都是ASCII字符嗎?這是什么意思?別忘了,還有全?和半?!
s='0123456789'#全?數(shù)字
('d+',s,re.U).group()結果:
0123456789
(2)re.M
多?匹配的模式其實也不常?,很少有???規(guī)整的數(shù)據(jù)。
s='aaarnbbbrnccc'
l('^[sw]*?$',s)
l('^[sw]*?$',s,re.M)結果:
['aaarnbbbrnccc']#單?模式
['aaar','bbbr','ccc']#多?模式(3)re.S
這個簡單,直接看個例?。
s='aaarnbbbrnccc'
l('^.*',s)
l('^.*',s,re.S)
結果:['aaar']
['aaarnbbbrnccc']
(4)re.X?法如下:
rc=e(r"""
d+#匹配數(shù)字
#和字母
[a-zA-Z]+""",re.X)
('123abc').group()
結果:123abc
注意,?了X修飾符后,正則中的所有空格會被忽略,包括正則??的原本有?的空格。如果正則中有需要使?空格,只能?s代替。(5)(?aiLmsux)
修飾符不僅可以代碼中指定,也可以在正則中指定。(?aiLmsux)員工自愿離職協(xié)議書 表?了以上所有的修飾符,具體?的時候需要哪個就右側腰疼 在?后?加上對應的
字母,?例如下,(?a)和re.A效果是?樣的:s='123abc你好'
('(?a)w+',s).group()
('w+',s,re.A).group()結果是?樣的:
123abc
123abc1.3、貪婪與懶惰
當正則表達式中包含能接受重復的限定符時,通常的?為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。s='aabab'
('a.*b',s).group()#這就是貪婪
('a.*?b',s).group()#這就是懶惰
結果:
aabab
aab簡單來說:
所謂貪婪,就是盡可能多的匹配;
所謂懶惰,就是盡可能少的匹配。*、+、{n,}這些表達式屬于貪婪;
*?、+?、{n,}?這些表達式就是懶惰(在貪婪的基礎上加上?)。
2、正則進階
2.1、捕獲分組
語法描述(exp)
匹配exp,并捕獲?本到?動命名的組?(?Pexp)
匹配exp,并捕獲?本到名稱為name的組?(?:exp)
匹配exp,不捕獲匹配的?本,也不給此分組分配組號(?P=name)
匹配之前由名為name的組匹配的?本
注意:在其他語?或者?上的?些正則?具中,分組命名的語法是(?exp)或(?'name'exp),但在Python?,這樣寫會報錯:This
namedgroupsyntaxisnotsupportedinthisregexdialect。Python中正確的寫法是:(?Pexp)?例?:
分組可以讓我們??條正則提取出多個信息,例如:
s='姓名:張三;性別:男;電話:9'
m=('姓名[::](w+).*?電話[::](d{11})',s)ifm:
name=(1)
phone=(2)
print(f'name:{name},phone:{phone}')結果:
name:張三,phone:?例?:
(?Pexp)有時還是會?到的,(?P=name)則很少情況下會?到。我想了?個(?P=name)的使??例,給?家看下效果:
s='''
張三30
9'''
pattern=r'.*?)>(.*?)(?P=name)>'
It=l(pattern,s)結果:
[('name','張三'),('age','30'),('phon描寫竹子的詩句 e','9')]
2.2、零寬斷?
語法描述(?=exp)
匹配exp前?的位置(?<=exp)
匹配exp后?的位置(?!exp)
匹配后?跟的不是exp的位置(?
匹配前?不是exp的位置
注意:正則中常?的前項界定(?<=exp)和前項否定界定(?
(?<=aaa)#正確
(?<=aaa|bbb)#正確
(?<=aaa|bb)#錯誤
(?<=d+)#錯誤
(?<=d{3})#正確2.3、條件匹配
這?概是最復雜的正則表達式了。語法如下:語法描述
(?(id/name)yes|no)
如果指定分組存在,則匹配yes模式,否則匹配no模式此語法極少?到,印象中只?過?次。
以下?例的要求是:如果以_開頭,則以字母結尾,否則以數(shù)字結尾。
s1='_abcd's2='abc1'
pattern='(_)?[a-zA-Z]+(?(1)[a-zA-Z]|d)'
(pattern,s1).group()
(pattern,s2).group()
結果:
_abcd
abc12.4、findall
Python中的l是個?較特別的?法(之所以說它特別,是跟我常?的C#做?較,在沒看注釋之前我想當然的掉坑?去了)。我們看這個?法的官?注釋:
Returnalistofallnon-overlappingmatchesinthestring.
Ifoneormorecapturinggroupsareprentinthepattern,return
alistofgroups;thiswillbealistoftuplesifthepatternhasmorethanonegroup.
Emptymatchesareincludedintheresult.簡單來說,就是
如果沒有分組,則返回整條正則匹配結果的列表;
如果有1個分組,則返回分組匹配到的結果的列表;
如果有多個分組,則返回分組匹配到的結果的元組的列表。看下?的例?:
s='aaa123b鼻子上有痣的女人 bb456ccc'
l('[a-z]+d+',s)#不包含分組
l('[a-z]+(d+)',s)#包含?個分組l('([a-z]+(d+))',s)#包含多個分組
l('(?:[a-z]+(d+))',s)#?:不捕獲分組匹配結果結果:
['aaa123','bbb456']['123','456']
[('aaa123','123'),('bbb456','456')]
['123','456']
零寬斷?中講到Python中前項界定必須是定長的,這很不?便,但是配合findall有分組時只取分組結果的特性,就可以模擬出?定長前
項界定的效果了。結語
其實正則就像是?個數(shù)學公式,會背公式不?定會做題。但其實這公式?點也不難,?少?學校?學的數(shù)學簡單多簡愛心得體會 了,多練習?次也就會了。

本文發(fā)布于:2023-04-12 00:28:22,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/1681230503126985.html
版權聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:正澤學校.doc
本文 PDF 下載地址:正澤學校.pdf
| 留言與評論(共有 0 條評論) |