Python中正則表達(dá)式模塊詳解
靈活性、邏輯性和功能性非常強(qiáng)? 可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制
正則語(yǔ)法
`#?1、數(shù)字和字母都表示它本身,?.?表示匹配除了換行以外的任意字符,????.?表示匹配?.
#?2、很多字母前面添加??會(huì)有特殊含義
????-?n:換行
????- t:制表符
????-?d:?匹配數(shù)字,等價(jià)[0-9]
????-?D:非數(shù)字,等價(jià)于[^0-9]
????-?w:表示數(shù)字、字母以及下劃線(xiàn),中文,等價(jià)于[0-9a-zA-Z_]
????- W:表示w取反
????-?s:表示任意的非打印字符(空格、換行、制表符)
????-?S:表示非空白字符
#?3、絕大多數(shù)標(biāo)點(diǎn)都有特殊含義
????-?():用來(lái)表示一個(gè)分組,如果需要表示括號(hào),需要使用?
????-?[]:?匹配范圍,[0-9]?表示0~9范圍中的一個(gè),[0-9a-zA-Z]
????-?|:?表示或者的意思?re.search(r'f(x|y|z)m','pdsfxm')???匹配fxm
????-?{},{2,},{,3},{1,3}:用來(lái)限定前面元素出現(xiàn)的次數(shù)??re.search(r'go{2}d','good')
????-?*:?表示前面的元素出現(xiàn)的次數(shù)為0次及以上,等價(jià)于{0,}
????-?+:?表示前面的元素出現(xiàn)的次數(shù)為1次及以上,等價(jià)于{1,}
????-?^:以指定的內(nèi)容開(kāi)頭,或者取反的意思
????-?$:以指定的內(nèi)容結(jié)尾
#?4、???的兩種用法
????-?規(guī)定前面元素出現(xiàn)的次數(shù)最多只能出現(xiàn)1次,等價(jià)于{,1}
????-?將貪婪模式轉(zhuǎn)換為非貪婪模式(重點(diǎn))`?
re模塊的介紹
常用方法
match、search 只查詢(xún)一次
finditer 查找到所有的匹配數(shù)據(jù)放到一個(gè)可迭代對(duì)象中
findall 把查找到的所有字符串結(jié)果放到一個(gè)列表中
fullmatch 完全匹配,字符串需要滿(mǎn)足正則表達(dá)式
Match類(lèi)的使用
Match類(lèi)的屬性和方法
pos、endpos 被查找字符串的起始和終端位置 span( ) 匹配到的下標(biāo)位置(元組) group 分組的概念
`import?re
m?=?re.search(r'c.*z',?'abcdefgz')
print(m.pos)??#?0
print(m.endpos)??#?8
print(m.span())??#?(2,?8)
#?使用group獲取獲取到匹配的字符串
print(m.group())?#?cdefgz
#?group表示正則表達(dá)式的分組
#?1、在正則表達(dá)式里使用()表示一個(gè)分組
#?2、如果沒(méi)有分組,默認(rèn)只有一組
#?3、分組的下標(biāo)從0開(kāi)始
#?這里有4個(gè)分組?
m1?=?re.search(r'(1.*)(2.*)(3.*4)',?'a1bcd2efgh3ij4k')
print(m1.group())??#?默認(rèn)就是第0組??1bcd2efgh3ij4
print(m1.group(0))??#?第0組就是把整個(gè)正則表達(dá)式當(dāng)做一個(gè)整體??1bcd2efgh3ij4
print(m1.group(1))??#?1bcd
print(m1.group(2))??#?2efgh
print(m1.group(3))??#?3ij4
#??groups()?將分組以元組的形式返回
print(m1.groups())??#?('1bcd',?'2efgh',?'3ij4')
#?(?P?表達(dá)式)?給分組取個(gè)名字
m2?=?re.search(r'(?P1.*)(?P2.*)(?P3.*4)' ,?'a1bcd2efgh3ij4k')
print(m2.groupdict())??#?{'one':?'1bcd',?'two':?'2efgh',?'three':?'3ij4'}`?
compile? 在re模塊,可以使用re.方法調(diào)用函數(shù),還可以調(diào)用re.compile得到一個(gè)對(duì)象
`import?re
#?這兩種寫(xiě)法沒(méi)有區(qū)別
m?=?re.search(r'm.*a',?'111m22222a')
print(m)??#?
m2?=?re.compile(r'm.*a')
result?=?m2.search('111m22222a')
print(result)?#?`?
正則修飾符
re.I 使匹配對(duì)大小寫(xiě)不敏感 re.M 多行匹配,影響 ^ 和$ re.S 使 . 匹配包括換行在內(nèi)的所有字符
`import?re
#?.?表示除了換行以外的任意字符
x?=?re.search(r'm.*a',?'abcdmonxxxa')
print(x)??#?None
#?re.S?匹配換行
y?=?re.search(r'm.*a',?'abcdmonxxxa',?re.S)??#?讓?.?匹配換行
print(y)
a?=?re.search(r'x',?'helloXyz')
print(a)??#?None
#?re.I?忽略大小寫(xiě)
b?=?re.search(r'x',?'helloXyz',?re.I)
print(b)??#?
#?re.M?讓$?匹配到換行
m?=?re.findall(r'w+$',?'i?am?boyn?you?are?girln?he?is?man')
print(m)??#?['man']
n?=?re.findall(r'w+$',?'i?am?boyn?you?are?girln?he?is?man',?re.M)
print(n)?#?['boy',?'girl',?'man']`?
正則替換
`import?re
#?把數(shù)字替換成x
m?=?re.sub(r'd',?'x',?'hello123wor123ld')
print(m)??#?helloxxxworxxxld
n?=?re.sub(r'd+',?'x',?'hello123wor123ld')
print(n)?#?helloxworxld
#?需求:將p中內(nèi)容的數(shù)字乘2
p?=?'hello50good34'
def?test(x):
????y?=?int(x.group(0))
????y?*=?2
????return?str(y)??#?這里只能以字符串的形式返回
print(re.sub(r'd+',?test,?p))?#?hello100good68`?
貪婪模式與非貪婪模式
import?re
m?=?re.search(r'm.*a',?'abcm123a456a')
print(m)??# m123a456a,這里為什么不是m123a呢?因?yàn)檫@里默認(rèn)使用的貪婪模式
n?=?re.search(r'm.*?a',?'abcm123a456a')
print(n)??#?m123a????使用?將貪婪模式轉(zhuǎn)化為非貪婪模式
#??
print(re.match(r'aa(d+)',?'aa123bb456').group(1))??#?123
print(re.match(r'aa(d+?)',?'aa123bb456').group(1))??#?1
print(re.match(r'aa(d+?)',?'aa123bb456').group(0))??#?aa1
#?雖然說(shuō)是盡可能少的匹配,但也要滿(mǎn)足匹配呀
print(re.match(r'aaa(d+)ddd',?'aaa2333ddd').group(0))??#?aaa2333ddd
print(re.match(r'aaa(d+?)ddd',?'aaa2333ddd').group(1))??#?2333
print(re.match(r'aaa(d+).*',?'aaa2333ddd').group(0))??#?aaa2333ddd
print(re.match(r'aaa(d+?).*',?'aaa2333ddd').group(1))??#?2

評(píng)論
圖片
表情
