正則表達(dá)式
預(yù)定義字符集(可以寫(xiě)在字符集[…]中)
.? ? 匹配除換行符“\n”外任意單個(gè)字符
\w 單詞字符:[A-Za-z0-9]
\W 非單詞字符:[^\w]
\s 空白符:[<空格>\t\r\n\f\v]
\S 非空白符[^\s]
\d 匹配數(shù)字:[0-9]
^開(kāi)頭$結(jié)尾
數(shù)量匹配:
* ? 匹配前一個(gè)字符0次或無(wú)限次
+? ? 匹配前一個(gè)字符一次或無(wú)限次
过蹂?? ? 匹配前一個(gè)字符0次或一次
{m}? 匹配前一個(gè)字符m次(abc{m},(abc){m})
{m,n}? 匹配前一個(gè)字符m至n次
[a-zA-Z ]? ? 匹配范圍([^a-z] 取反)
#所有的特殊字符在字符集中都失去其原有的特殊含義
*? +? ?? {m,n}?? 使* + ? {m,n}變?yōu)榉秦澙纺J?/p>
名稱捕獲(?P<name>…)
re模塊的相關(guān)方法:
re.match(p,text)? 只匹配開(kāi)頭的位置,返回一個(gè)match對(duì)象
re.search(p,text)? 匹配到了p就返回邦危,只返回第一個(gè)匹配到的
re.findall(p,text)? 將匹配到的全返回引镊,返回一個(gè)list
re.split(p,text)? 以匹配到的字符為分隔符切割text姑丑,返回一個(gè)list
re.sub(p,s,text)? 替換陨晶,將p匹配到的字符串替換為s
>>import re
>>text=”c++ python2 python3 perl ruby lua java php5 php7”
>>a=re.match(r’c\+\+’,text)? #返回一個(gè)match對(duì)象(匹配c++)
>>a.group()
>>c++
>>a=re.match(r’java’,text)? #必須從頭匹配
>>a.group()
>>print a
>>None
>>a=re.findall(r’python’,text)
>>a
>>[‘python’,’python’]? ? #返回一個(gè)列表
>>li=re.split(r’pe’,text)
>>li
>>[‘c++ python2 python3’,’rl ruby lua java php5 php7’]
>>text=”c++ python2 python3 perl ruby lua java php5 php7c++peeeo text hph”
>>re.findall(r’p[^0-9]*?’,text)? #非貪婪模式
[‘p’,’p’,’p’,’p’,’p’,’p’,’p’,’p’,’p’]
命名分組
>> text=”c++ python2 python3 perl ruby lua java php5 php7c++peeeo text hph”
>>a=re.findall(r’(p[a-zA-Z]+) (0-9)’,text)? #位置分組
>>a
>>[(‘python’,’2’),(‘python’,’3’),(‘php’,’5’),(‘php’,’7’)]
>>a=re.search(r’(?P<name>p[a-zA-Z]+) (?P<version>[0-9])’,text) #返回match對(duì)象
>>a.group()
python2
>>a.groupdict()
{‘name’:’python’,’version’:’2’}
編譯模式
pattern=re.compile(p)先編譯p模式查牌,當(dāng)正則表達(dá)式比較復(fù)雜的時(shí)候对碌,會(huì)先編譯荆虱,然后使用result=patter.match(text),就可以使用編譯好的模式去匹配各種字符串了,性能會(huì)有所提升朽们。
>>p=re.compile(r’(?P<name>p[a-zA-Z]+) (?P<version>[0-9])’)
>>a=p.search(“python333333”)
>>a.groupdict()
>>{‘name’:’python’,’version’:’3’}