史上最全 Python Re 模块讲解(三)
生活随笔
收集整理的這篇文章主要介紹了
史上最全 Python Re 模块讲解(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
繼上篇
https://blog.csdn.net/weixin_42625143/article/details/95330557
“{m}” :匹配字符串出現m次
>>> pat = re.compile( [op]{2} ) #o或p出現2次 >>> pat.search( abcooapp ).group() #匹配第一次出現的字符串,o比p先出現 oo >>> pat.findall( abcooapp ) #匹配出現的所有字符串,列表形式返回 [ oo , pp ]“{m,n}” :匹配字符串出現m到n次
>>> pat = re.compile( [op]{2,4} ) #o或則p出現2到4次 >>> pat.match( pppabcooapp ).group() #匹配開頭 ppp >>> pat.search( pppabcooapp ).group() #匹配第一次出現 ppp >>> pat.findall( pppabcooapp ) #匹配所有 [ ppp , oo , pp ].group() #匹配第一次出現
邊界
“^” :匹配字符串開頭或行頭
“$” :匹配字符串結尾或則行尾
>>> pat = re.compile( [abc]$ ) >>> pat.match( adefAbc ).group() #match匹配的是字符串開頭,所以查找$的時,總是返回None >>> pat.search( adefAbc ).group() #結尾是a、b、c中的任意一個 c >>> pat.findall( adefAbc ) [ c ] >>> pat = re.compile( [abc]+$ ) >>> pat.search( adefAbc ).group() #結尾是a、b、c中的任意一個的一次或則多次,貪婪:匹配多個 bc >>> pat.findall( adefAbc ) [ bc ]“A”:匹配字符串開頭
>>> pat = re.compile( A[abc]+ ) >>> pat.findall( cbadefab ) [ cba ] >>> pat.search( cbadefab ).group() cba“Z”:匹配字符串結尾
>>> pat = re.compile( [abc]+Z ) >>> pat.search( cbadefab ).group() ab >>> pat.findall( cbadefab ) [ ab ]分組
(…):分組匹配,從左到右,每遇到一個 ( 編號+1,分組后面可加數量詞
:引用編號為的分組匹配到的字符串
>>> pat=re.compile(r www.(.*)..{3} ) >>> pat.match( www.dxy.com ).group(1) dxy“(?P…)” :在模式里面用()來表示分組(命名分組),適用于提取目標字符串中的某一些部位。
>>> pat=re.compile(r (?P<K>a)w(c) ) #分2組:命名分組+匿名分組 >>> pat.search( abcdef ).groups() #取所有分組,元組形式返回 ( a , c ) >>> pat.search( abcdef ).group(1) #取分組1,適用于match a >>> pat.search( abcdef ).group(2) #取分組2,適用于match c >>> pat.search( abcdef ).group() #默認返回匹配的字符串 abc >>> pat.search( abcdef ).groupdict() #命名分組可以返回一個字典【專有】,匿名分組也沒有 { K : a }“(?P=name)”:引用別名為的分組匹配到的串
>>> pat=re.compile(r (?P<K>a)w(c)(?P=K) ) #(?P=K)引用分組1的值,就是a >>> pat.search( abcdef ).group() #匹配不到,因為完整 awca ,模式的第4位是a Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: NoneType object has no attribute group>>> pat.search( abcadef ).group() #匹配到,模式的第4位和組1一樣,值是c abca >>> pat.search( abcadef ).groups() ( a , c ) >>> pat.search( abcadef ).group(1) a >>> pat.search( abcadef ).group(2) c“” :引用分組編號匹配:
>>> pat=re.compile(r (?P<K>a)w(c)(?P=K) ) #引用分組2的值,就是c >>> pat.findall( Aabcadef ) #匹配不到,因為完整 awcac ,模式的第5位是c [] >>> pat.findall( Aabcacdef ) #匹配到,模式的第5位和組2一樣,值是c [( a , c )] >>> pat.search( Aabcacdef ).groups() ( a , c ) >>> pat.search( Aabcacdef ).group() abcac >>> pat.search( Aabcacdef ).group(1) a >>> pat.search( Aabcacdef ).group(2) c特殊構造
(?:…) (…)不分組版本,用于使用 | 或者后接數量詞 (?iLmsux) iLmsux的每個字符代表一個匹配模式,只能用在正則表達式的開頭,可選多個 (?#…) #號后的內容將作為注釋 (?=…) 之后的字符串內容需要匹配表達式才能成功匹配 (?!…) 之后的字符串不匹配表達式才能成功 (?(?(?(id/name) yes |no) 如果編號為id/名字為name的組匹配到字符串,則需要匹配yes,否則匹配no,no可以省略“(?:…)” :()里面有?:表示該()不是分組
>>> pat=re.compile(r a(?:bc) ) >>> pat.findall( abc ) [ abc ] >>> pat.match( abc ).groups() #顯示不出分組“(?=…)”:匹配…表達式,返回。對后進行匹配,總是對后面進行匹配
>>> pat=re.compile(r w(?=d) ) #匹配表達式d,返回數字的前一位,w:單詞字符[A-Za-z0-9] >>> pat.findall( abc1 def1 xyz1 ) [ c , f , z ] >>> pat.findall( zhoujy20130628hangzhou ) #匹配數字的前一位,列表返回 [ y , 2 , 0 , 1 , 3 , 0 , 6 , 2 ] >>> pat=re.compile(r w+(?=d) ) >>> pat.findall( abc1,def1,xyz1 ) #匹配最末數字的前字符串,列表返回 [ abc , def , xyz ] >>> pat.findall( abc21,def31,xyz41 ) [ abc2 , def3 , xyz4 ] >>> pat.findall( zhoujy20130628hangzhou ) [ zhoujy2013062 ] >>> pat=re.compile(r [A-Za-z]+(?=d) ) #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall( zhoujy20130628hangzhou123 ) #匹配后面帶有數字的字符串,列表返回 [ zhoujy , hangzhou ] >>> pat.findall( abc21,def31,xyz41 ) [ abc , def , xyz ]“(?!…)” 不匹配…表達式,返回。對后進行匹配
>>> pat=re.compile(r [A-Za-z]+(?!d) ) #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 ) #匹配后面不是數字的字符串,列表返回 [ zhouj , hangzho , binjian ] >>> pat.findall( abc21,def31,xyz41 ) [ ab , de , xy ]“(?<=…)”:匹配…表達式,返回。對前進行匹配,總是對前面進行匹配
>>> pat=re.compile(r (?<=d)[A-Za-z]+ ) #匹配前面是數字的字母 >>> pat.findall( abc21,def31,xyz41 ) [] >>> pat.findall( 1abc21,2def31,3xyz41 ) [ abc , def , xyz ] >>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 ) [ hangzhou ]“(?<!…)”:不匹配…表達式,返回。對前進行匹配,總是對前面進行匹配
>>> pat=re.compile(r (?<!d)[A-Za-z]+ ) #匹配前面不是數字的字母 >>> pat.findall( abc21,def31,xyz41 ) [ abc , def , xyz ] >>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 ) [ zhoujy , angzhou , binjiang ]“(?(id/name) yes |no)”: 組是否匹配,匹配返回
>>> pat=re.compile(r a(d)?bc(?(1)d) ) #no省略了,完整的是adbcd ==> a2bc3,總共5位,第2位是可有可無的數字,第5為是數字 >>> pat.findall( abc9 ) #返回組1,但第2位(組1)沒有,即返回了 [ ] >>> pat.findall( a8bc9 ) #完整的模式,返回組1 [ 8 ] >>> pat.match( a8bc9 ).group() a8bc9 >>> pat.match( a8bc9 ).group(1) 8 >>> pat.findall( a8bc ) #第5位不存在,則沒有匹配到 []“(?iLmsux)”:這里就介紹下i參數:大小寫區分匹配
>>> pat=re.compile(r abc ) >>> pat.findall( abc ) [ abc ] >>> pat.findall( ABC ) [] >>> pat=re.compile(r (?i)abc ) #(?i) 不區分大小寫 >>> pat.findall( ABC ) [ ABC ] >>> pat.findall( abc ) [ abc ] >>> pat.findall( aBc ) [ aBc ] >>> pat.findall( aBC ) [ aBC ] >>> pat=re.compile(r abc ,re.I) #re.I 作為參數使用,推薦 >>> pat.findall( aBC ) [ aBC ] >>> pat.findall( abc ) [ abc ] >>> pat.findall( ABC ) [ ABC ]總結
以上是生活随笔為你收集整理的史上最全 Python Re 模块讲解(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最全 Python Re 模块讲解(
- 下一篇: python零基础学习教程之Python