目錄:
1.概述
2.元字符
3.次數(shù)匹配
4.單行與多行模式
1.概述
概述:
正則表達(dá)式故硅,Regular Expression蛉谜,縮寫(xiě)為regex、regexp、RE等,正則表達(dá)式是文本處理極為重要的技術(shù)边翼,用它可以對(duì)字符串按照某種規(guī)則及逆行檢索、
替換紊婉。1970年代米者,Unix之父Ken Thompson將正則表達(dá)式引入到Unix中文本編輯器ed和grep命令中,由此正則表達(dá)式普及開(kāi)來(lái)畜晰。1980年后砾莱,perl語(yǔ)言
對(duì)Henry Spencer編寫(xiě)的庫(kù),擴(kuò)展了很多新的特性凄鼻。1997年開(kāi)始腊瑟,Philip Hazel開(kāi)發(fā)了PCRE(Perl Compatible Regular Expression),它被PHP和
HTTPD等工具采用块蚌。正則表達(dá)式應(yīng)用極其廣泛闰非,shell中處理文本的命令,各級(jí)高級(jí)編程語(yǔ)言都支持正則表達(dá)式峭范。
分類(lèi):
1.BRE
基本正則表達(dá)式财松、grep、sed纱控、vi等軟件支持游岳。vim有擴(kuò)展
2.ERE
擴(kuò)展正則表達(dá)式,egrep (grep -E)其徙、sed -r等
3.PCRE
幾乎所有高級(jí)語(yǔ)言都是PCRE的方言或者變種胚迫。Python從1.6開(kāi)始使用SRE正則表達(dá)式引擎、可以認(rèn)為是PCRE的子集唾那,見(jiàn)模塊re访锻。
2.元字符
2.1 元字符 metacharacter
代碼 說(shuō)明 舉例
. 匹配除換行符外任意一個(gè)字符
[abc] 字符集合褪尝,只能表示一個(gè)字符位置。匹配所包含的任意一個(gè)字符期犬。 [abc]匹配plain中的'a'
[^abc] 字符集合河哑,只能表示一個(gè)字符位置。匹配除去集合內(nèi)字符的任意一個(gè)字符 [^abc]可以匹配plain中'p','l','i'或者'n'
[a-z] 字符范圍龟虎,也是個(gè)集合璃谨,表示一個(gè)字符位置匹配所包含的任意一個(gè)字符 常用[A-Z] [0-9]
\b 匹配單詞的邊界 \bb在文本中找到單詞中b開(kāi)頭的b字符
\B 不匹配單詞的邊界 t\B包含t的單詞但是不以t結(jié)尾的t字符,例如write
\Bb不以b開(kāi)頭的含有b的單詞鲤妥,例如able
\d [0-9]匹配1位數(shù)字 \d
\D [^0-9]匹配1位非數(shù)字
\s 匹配1位空白字符佳吞,包括換行符、制表符棉安、空格[\f\r\n\t\v]
\S 匹配1位非空白字符
\w 匹配[a-zA-Z0-9_]底扳,包括中文的字 \w
\W 匹配\w之外的字符
2.2 轉(zhuǎn)義
凡是在正則表達(dá)式中有特殊意義的符號(hào),如果想使用它的本意贡耽,請(qǐng)使用\轉(zhuǎn)義衷模。反斜杠自身,得使用\\
\r \n還是轉(zhuǎn)義后代表回車(chē)蒲赂,換行
3.次數(shù)匹配
3.1 次數(shù)匹配
代碼 說(shuō)明 舉例
* 表示前面的正則表達(dá)式會(huì)重復(fù)0次或多次 e\w*單詞中e后面可以有非空白字符
+ 表示前面的正則表達(dá)式重復(fù)至少1次 e\w+單詞中e后面至少有一個(gè)非空白字符
? 表示前面的正則表達(dá)式會(huì)重復(fù)0次或1次 e\w?單詞中e后面至多有一個(gè)非空白字符
{n} 重復(fù)固定的n次 e\w{?}單詞中e后面只能有一個(gè)非空白字符
{n,} 重復(fù)至少n次 e\w{1,}等價(jià)e\w+阱冶,e\w{0,}等價(jià)e\w*,e\w{0,1}等價(jià)e\w?
{n,m} 重復(fù)n到m次 e\w{1,10}單詞中e后面至少1個(gè)滥嘴,至多10個(gè)非空白字符
x|y 匹配x或者y wood took foot food使用w|food或者(w|f)ood
3.2 捕獲
代碼 說(shuō)明 舉例
(pattern) 使用小括號(hào)指定一個(gè)子表達(dá)式木蹬,也叫分組,
捕獲后會(huì)自動(dòng)分配組號(hào)從1開(kāi)始氏涩,可以改變優(yōu)先級(jí)
\數(shù)字 匹配對(duì)應(yīng)的分組 (very) \1 匹配very very届囚,但捕獲的組group是very
(?:pattern) 如果僅僅為了改變優(yōu)先級(jí),就不需要捕獲分組 (?:w|f)ood是尖,'industr(?:y|ies)等價(jià)'意系,'industry|industries'
(?<name>exp) 分組捕獲,但是可以通過(guò)name訪(fǎng)問(wèn)分組Python語(yǔ)法必須是(?P<name>exp)
(?'name'exp)
3.3 零寬斷言
wood took foot food
代碼 說(shuō)明 舉例
(?=exp) 零寬度正預(yù)測(cè)先行斷言饺汹,斷言exp一定在匹配的右邊出現(xiàn)蛔添, f(?=oo) f后面一定有oo出現(xiàn)
也就是說(shuō)斷言后面一定跟個(gè)exp
(?<=exp) 零寬度正回顧后發(fā)斷言,斷言exp一定在匹配的左邊出現(xiàn)兜辞, (?<=f)ood迎瞧、(?<=t)ook分別匹配ood、ook逸吵、ook前一定有t出現(xiàn)
也就是說(shuō)前面一定有個(gè)exp前綴
3.4 負(fù)向零寬斷言
代碼 說(shuō)明 舉例
(?!exp) 零寬度負(fù)預(yù)測(cè)先行斷言凶硅,斷言exp一定不會(huì)出現(xiàn)在右側(cè), \d{3}(?!\d)匹配3位數(shù)字扫皱,斷言3位數(shù)字后面一定不能是
也就是說(shuō)斷言后面一定不是exp 數(shù)字foo(?!d)foo后面一定不是d
(?<!exp) 零寬度負(fù)回顧后發(fā)斷言足绅,斷言exp一定不能出現(xiàn)在左側(cè)捷绑, (?<!f)ood ood的左邊一定不是f
也就是說(shuō)斷言前面一定不能是exp
NOTE:
1.斷言不占分組號(hào),斷言如同條件氢妈,只是要求匹配必須滿(mǎn)足斷言的條件
2.使用正則表達(dá)式時(shí)粹污,能用簡(jiǎn)單表達(dá)式,就不要復(fù)雜的表達(dá)式
3.5 貪婪與非貪婪
默認(rèn)是貪婪模式首量,也就是說(shuō)盡量多匹配更長(zhǎng)的字符串壮吩;
非貪婪實(shí)在重復(fù)的符號(hào)后面加上一個(gè)?號(hào),就盡量少匹配了加缘。
代碼 說(shuō)明
*? 匹配任意次鸭叙,但盡可能少重復(fù)
+? 匹配至少1次,但盡可能少重復(fù)
?? 匹配0次或1次生百,但盡可能少重復(fù)
{n,}? 匹配至少n次递雀,但盡可能少重復(fù)
{n,m}? 匹配至少n次柄延,至多m次蚀浆,但盡可能少重復(fù)
4.單行與多行模式
4.1 單行模式
. 可以匹配所有字符,包括換行符
^ 表示真?zhèn)€字符串的開(kāi)頭搜吧,$整個(gè)字符串的結(jié)尾
4.2 多行模式
. 可以匹配除了換行符之外的字符
^ 表示行首市俊,$行尾
^ 表示整個(gè)字符串的開(kāi)始,$表示整個(gè)字符串的結(jié)尾滤奈。
開(kāi)始指的是\n后緊接著下一個(gè)字符摆昧,結(jié)束指的是\n前的字符