正則表達(dá)式
正則表達(dá)式通常都包含反斜杠'\',所以用r'\t'來來表示正則表達(dá)式字符串,r'a string'是強(qiáng)制不進(jìn)行轉(zhuǎn)義,類似c#的@"a string"。
模式? ? ? ? ? ? ? ? ? 意義
^? ? ? ? ? ? ? ? ? ? ? ? 匹配字符串的開頭
$? ? ? ? ? ? ? ? ? ? ? ? 匹配字符串的末尾
.? ? ? ? ? ? ? ? ? ? ? ? ?匹配任意字符,除了換行符,當(dāng)re.DOTALL標(biāo)記被指定時,則可以匹配換行符
[...]? ? ? ? ? ? ? ? ? ? ?用來表示一組字符,單獨列出:[abc]匹配'a','b',或'c'
[^...]? ? ? ? ? ? ? ? ? ? 匹配不在[]中的字符;
re*? ? ? ? ? ? ? ? ? ? ? 匹配0個或多個的表達(dá)式;
re+? ? ? ? ? ? ? ? ? ? ? 匹配1個或多個的表達(dá)式;
re?? ? ? ? ? ? ? ? ? ? ?匹配0個或1個由前面的正則表達(dá)式定義的片段,非貪婪方式;
re{n,}? ? ? ? ? ? ? ? ? ?精確匹配n個前面表達(dá)式
re{n,m}? ? ? ? ? ? ? ? 匹配n到m次由前面的正則表達(dá)式定義的片段,貪婪方式;
a|b? ? ? ? ? ? ? ? ? ? ? ?匹配a或b
(re)? ? ? ? ? ? ? ? ? ? ? ?匹配括號內(nèi)的表達(dá)式;
(?imx)? ? ? ? ? ? ? ? ? 正則表達(dá)式包含三種可選標(biāo)志:i,m或x。只影響括號內(nèi)的區(qū)域;
(?-imx)? ? ? ? ? ? ? ? ?正則表達(dá)式關(guān)閉i,m,x可選標(biāo)志。只影響括號內(nèi)的區(qū)域;
(?#...)? ? ? ? ? ? ? ? ? ?注釋;
\w? ? ? ? ? ? ? ? ? ? ? ? 匹配字母數(shù)字,等價于[A-Za-z0-9]
\W? ? ? ? ? ? ? ? ? ? ? ? 匹配非字母數(shù)字,等價于[^A-Za-z0-9]
\s? ? ? ? ? ? ? ? ? ? ? ? ? 匹配任意空白字符,等價于[\t\n\r\f];
\S? ? ? ? ? ? ? ? ? ? ? ? ?匹配任意非空白字符;
\d? ? ? ? ? ? ? ? ? ? ? ? ?匹配任意數(shù)字,等價于[0-9]
\D? ? ? ? ? ? ? ? ? ? ? ? 匹配任意非數(shù)字
\A? ? ? ? ? ? ? ? ? ? ? ? 匹配字符串開始
\Z? ? ? ? ? ? ? ? ? ? ? ? 匹配字符串結(jié)束,如果存在換行,只匹配到換行前的結(jié)束字符串
\z? ? ? ? ? ? ? ? ? ? ? ? 匹配字符串結(jié)束
\G? ? ? ? ? ? ? ? ? ? ? ? 匹配最后匹配完成的位置;
\b? ? ? ? ? ? ? ? ? ? ? ? ?匹配一個單詞邊界,eg。'er\b'可以匹配'never'的‘er’,但是不能匹配'verb'的‘er’;
\B? ? ? ? ? ? ? ? ? ? ? ? 匹配非單詞邊界,意義與\b相反;
\n,\t等? ? ? ? ? ? ? ? ? 匹配換行符,制表符等
\1...\9? ? ? ? ? ? ? ? ? ?匹配第n個分組的內(nèi)容;
\10? ? ? ? ? ? ? ? ? ? ? ?匹配第10個分組的內(nèi)容,如果它匹配,否則值的是八進(jìn)制字符嗎的表達(dá)式
Python正則表達(dá)式模塊
python正則表達(dá)式模塊為re,import re,即可進(jìn)行正則操作。
re.match函數(shù)
re.match(pattern, string, flag=0)
pattern? 正則表達(dá)式
string? ? 要匹配的字符串
flag? ? ? ?標(biāo)志位,用于控制正則表達(dá)式的匹配方式。如:re.I匹配大小寫不敏感;re.M多行匹配。
re.match函數(shù)匹配成功返回匹配對象,否則返回None。
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
print(matchObj.group())
print(matchObj.group(0))
print(matchObj.group(1))
print(matchObj.group(2))
輸出:
Cats are smarter than dogs
Cats are smarter than dogs
Cats
smarter
正則表達(dá)式對象
re.RegexObject
re.complie()返回RegexObject對象。
re.MatchObject
它的幾個方法:
start()返回匹配開始的位置
end()返回匹配結(jié)束的位置
span()返回一個元組包含匹配(開始,結(jié)束)的位置
re.search方法
re.search(pattern, string, flag=0)
search和match的區(qū)別:
match匹配字符串的開始,如果開始不符合正則表達(dá)式,則匹配失敗。search匹配整個字符串,知道找到一個匹配。
import re
line = "Cats are smarter than dogs"
matchobj1 = re.match(r'dogs', line, re.M|re.I)
if matchobj1:
? ? ? print("match --> matchobj.group():", matchobj1.group())
else:
? ? ? ?print("no match")
matchObj2 = re.search(r'dogs', line, re.M|re.I)
if matchObj2:
? ? ? print("search --> matchobj2.group():", matchObj2.group())
else:
? ? ? print("No match!!")
re.sub(pattern, repl, string, count=0)
pattern: 正則表達(dá)式
repl: 替換的字符串,也可以是一個函數(shù)
string 要被查找替換的原始字符串
模式匹配后替換的最大次數(shù),默認(rèn)為0表示替換所有的匹配。
phone ="2004-959-559 # 這是一個電話號碼"
num = re.sub(r'#.*$', "", phone)
print(num)
num2 = re.sub(r'\D', "", phone)
print(num2)
def double(matched):
? ? ? ?value =int(matched.group('value'))
? ? ? ?return str(value*2)
s ="ss12de4gh78"
print(re.sub(r'(?P<value>\d+)', double, s))
re.finditer
re.finditer(pattern, string, flags=0)
it = re.finditer(r'\d+', "123a45b67c78def9")
for matchin it:
? ? ? print(match.group())