Python中正則表達(dá)式模塊詳解
靈活性、邏輯性和功能性非常強(qiáng)? 可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制
正則語法
`#?1、數(shù)字和字母都表示它本身,?.?表示匹配除了換行以外的任意字符,????.?表示匹配?.
#?2、很多字母前面添加??會有特殊含義
????-?n:換行
????- t:制表符
????-?d:?匹配數(shù)字,等價[0-9]
????-?D:非數(shù)字,等價于[^0-9]
????-?w:表示數(shù)字、字母以及下劃線,中文,等價于[0-9a-zA-Z_]
????- W:表示w取反
????-?s:表示任意的非打印字符(空格、換行、制表符)
????-?S:表示非空白字符
#?3、絕大多數(shù)標(biāo)點都有特殊含義
????-?():用來表示一個分組,如果需要表示括號,需要使用?
????-?[]:?匹配范圍,[0-9]?表示0~9范圍中的一個,[0-9a-zA-Z]
????-?|:?表示或者的意思?re.search(r'f(x|y|z)m','pdsfxm')???匹配fxm
????-?{},{2,},{,3},{1,3}:用來限定前面元素出現(xiàn)的次數(shù)??re.search(r'go{2}d','good')
????-?*:?表示前面的元素出現(xiàn)的次數(shù)為0次及以上,等價于{0,}
????-?+:?表示前面的元素出現(xiàn)的次數(shù)為1次及以上,等價于{1,}
????-?^:以指定的內(nèi)容開頭,或者取反的意思
????-?$:以指定的內(nèi)容結(jié)尾
#?4、???的兩種用法
????-?規(guī)定前面元素出現(xiàn)的次數(shù)最多只能出現(xiàn)1次,等價于{,1}
????-?將貪婪模式轉(zhuǎn)換為非貪婪模式(重點)`?
re模塊的介紹
常用方法
match、search 只查詢一次
finditer 查找到所有的匹配數(shù)據(jù)放到一個可迭代對象中
findall 把查找到的所有字符串結(jié)果放到一個列表中
fullmatch 完全匹配,字符串需要滿足正則表達(dá)式
Match類的使用
Match類的屬性和方法
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á)式里使用()表示一個分組
#?2、如果沒有分組,默認(rèn)只有一組
#?3、分組的下標(biāo)從0開始
#?這里有4個分組?
m1?=?re.search(r'(1.*)(2.*)(3.*4)',?'a1bcd2efgh3ij4k')
print(m1.group())??#?默認(rèn)就是第0組??1bcd2efgh3ij4
print(m1.group(0))??#?第0組就是把整個正則表達(dá)式當(dāng)做一個整體??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á)式)?給分組取個名字
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得到一個對象
`import?re
#?這兩種寫法沒有區(qū)別
m?=?re.search(r'm.*a',?'111m22222a')
print(m)??#?
m2?=?re.compile(r'm.*a')
result?=?m2.search('111m22222a')
print(result)?#?`?
正則修飾符
re.I 使匹配對大小寫不敏感 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?忽略大小寫
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呢?因為這里默認(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
#?雖然說是盡可能少的匹配,但也要滿足匹配呀
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

評論
圖片
表情
