本文首發(fā)于我的個(gè)人博客Suixin's Blog
Python的 re 模塊提供了正則表達(dá)式匹配的功能,其中經(jīng)常會(huì)用到一些特殊字符,下面羅列它們以及各自的用法。
特殊字符
-
.:匹配除了換行符\n之外的任何字符; -
^:匹配字符串的開(kāi)頭(需放到正則表達(dá)式開(kāi)頭); -
$:匹配字符串的結(jié)尾(需放到正則表達(dá)式結(jié)尾); -
*:匹配前一個(gè)表達(dá)式0次或多次。例如:ab*可匹配a,ab或abbbbbbbbb等; -
+:匹配前一個(gè)表達(dá)式1次或多次。例如:ab*可匹配ab或abbbbbbbbb等; -
?:匹配前一個(gè)表達(dá)式0次或1次。例如:ab?可匹配a和ab; -
{m}:精確匹配前一個(gè)表達(dá)式m次。例如:ab{2}c不能匹配abc,但卻能匹配abbc。實(shí)測(cè):可以匹配小于m個(gè),但不能匹配大于m個(gè),Why?,例如:ab{2}可以匹配abbbbbc,So精確模式? -
{m,}:匹配前一個(gè)表達(dá)式至少m次,貪婪模式(盡可能多的匹配); -
{m,n}:匹配前一個(gè)表達(dá)式m到n次,貪婪模式; -
{m,n}?:匹配前一個(gè)表達(dá)式m到n次,非貪婪模式(盡可能少的匹配); -
[…]:用來(lái)表示一組字符- 匹配其中的單個(gè)字符。例如:
[abc]將會(huì)匹配a,b或c; - 匹配一個(gè)范圍,通過(guò)
-表示。例如:[a-z]表示匹配任何小寫字母,[0-9][0-9]表示匹配任意二位數(shù)字 -
[^…]將匹配不在[]中的字符。例如:[^abc]將匹配除了a,b和c之外的字符。
- 匹配其中的單個(gè)字符。例如:
-
a|b:匹配a或b; -
(…):匹配括號(hào)內(nèi)的表達(dá)式,作為一個(gè)整體; -
\w:匹配字母數(shù)字及下劃線,等價(jià)于[a-zA-Z0-9_]; -
\W:匹配非字母數(shù)字及下劃線,等價(jià)于[^a-zA-Z0-9_]; -
\s:匹配任意空白字符,等價(jià)于[\t\n\r\f\v][1]; -
\S:匹配任意非空字符,等價(jià)于[^\t\n\r\f\v]; -
\d:匹配任意數(shù)字,等價(jià)于[0-9]; -
\D:匹配任意非數(shù)字,等價(jià)于[^0-9]。
巧用?
正則表達(dá)式中*,+和?都是貪婪的,它們盡可能多的匹配,但實(shí)際使用中有時(shí)并不可取。通過(guò)對(duì)其加一個(gè)?來(lái)限制匹配的次數(shù),達(dá)到非貪婪的效果。
例如,原文本為:
str = 'AAsuixinBBAAsuixinBB'
使用貪婪表達(dá)式
res = re.search(r'AA(.+)BB', str)
print(res.group())
將會(huì)輸出
AAsuixinBBAAsuixinBB
使用非貪婪模式
res = re.search(r'AA(.+?)BB', str)
print(res.group())
將會(huì)輸出
AAsuixinBB
.+?與.*?
- 都是非貪婪匹配任意字符;
-
.+?必須匹配到至少一個(gè)任意字符,而.*?可以匹配到0次。例如,合理使用Python中正則表達(dá)式的特殊字符,無(wú)論‘合理’與‘使用’之間有沒(méi)有‘的’,使用.*?均可匹配到結(jié)果,而使用.+?將返回None。
re中常用的四個(gè)函數(shù)findall,match,search和sub
re.findall(pattern, string, flags=0)
在string中從左到右匹配所有符合情況的字符串,返回一個(gè)list,如果沒(méi)有匹配到,則返回一個(gè)空的list。其中flags表示匹配模式,比如忽略大小寫,多行模式等。
re.match(pattern, string, flags=0)
從字符串開(kāi)頭進(jìn)行匹配,返回“匹配對(duì)象”,如果未匹配到,則返回None。
“匹配對(duì)象”:布爾值為True,使用.group()或.group(0)返回匹配得到的字符串,使用.group(1)返回匹配的第一個(gè)括號(hào)內(nèi)的字符串,依次類推……使用.start()和.end()分別返回匹配開(kāi)始和結(jié)束的位置。
re.search(pattern, string, flags=0)
在字符串任意位置進(jìn)行匹配,查到第一個(gè)符合pattern的字符串,返回“匹配對(duì)象”,如果未匹配到,則返回None。
re.sub(pattern, repl, string, count=0, flags=0)
返回將string中匹配的pattern替換為repl后的字符串,如果未匹配到則返回string。count表示可替換的最大次數(shù),默認(rèn)為0表示所有的都將被替換。
參考
https://docs.python.org/3/library/re.html
http://www.runoob.com/python/python-reg-expressions.html
-
'\r': 換行,光標(biāo)在上一行;'f': 換頁(yè)符;'\v': 垂直制表符。 ?