Python中正則表達(dá)式的特殊字符

本文首發(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,ababbbbbbbbb等;
  • +:匹配前一個(gè)表達(dá)式1次或多次。例如:ab*可匹配ababbbbbbbbb等;
  • ?:匹配前一個(gè)表達(dá)式0次或1次。例如:ab?可匹配aab;
  • {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,bc;
    • 匹配一個(gè)范圍,通過(guò)-表示。例如:[a-z]表示匹配任何小寫字母,[0-9][0-9]表示匹配任意二位數(shù)字
    • [^…]將匹配不在[]中的字符。例如:[^abc]將匹配除了abc之外的字符。
  • a|b:匹配ab;
  • (…):匹配括號(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


  1. '\r': 換行,光標(biāo)在上一行;'f': 換頁(yè)符;'\v': 垂直制表符。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容