正則表達式
概述
正則表達式是文本處理極爲重要的技術,用它可以對字符串按照某種規則進行檢索、替換。
分類
- BRE
基本正則表達式,grep、sed、vi等軟件支持。
- ERE
擴展正則表達式,egrep ( grep -E )、sed -r等。
- PCRE
幾乎所有高級語言都是PCRE的變種。Pythoncong1.6開始使用SRE正則表達式引擎,可以認爲是PCRE的子集,見模塊re。
基本語法
代碼 |
說明 |
舉例 |
. |
匹配除換行符外的任意一個字符 |
. |
[abc] |
字符集合,只能表示一個字符位置。匹配所包含的任意一個字符 |
[abc]匹配plain中的’a’ |
[^abc] |
字符集合,只能表示一個字符位置。匹配除去集合內字符的任意一個字符 |
[^abc]可以匹配plain中的’p’,’l’,’i’,’n’ |
[a-z] |
字符範圍,也是一個集合,表示一個字符位置 匹配所包含的任意一個字符 |
常用[A-z][0-9] |
[^a-z] |
字符範圍,也是一個集合,表示一個字符位置 匹配出去集合內字符的任意一個字符 |
|
\b |
匹配單詞的邊界 |
\bb在文本中找到單詞中b開頭的b字符 |
\B |
不匹配單詞的邊界 |
t\B包含t的單詞但是不以t結尾的t字符。 例如write \Bb不以b開頭的b單詞,例如able |
\d |
[0-9]匹配以爲數字 |
|
\D |
[^0-9]匹配一位非數字 |
|
\s |
匹配1位空白字符,包含換行符、製表符、空格 |
|
\S |
匹配1位非空白字符 |
|
\w |
匹配[a-zA-Z0-9_],包括中文的子 |
|
\W |
匹配\w之外的字符 |
|
轉義
凡是在正則表達式中有特殊意義的符號,如果想使用它的本意,請使用\轉義。反斜槓自身,需要使用\\
\r,\n還是轉以後代表、換行
重複
代碼 |
說明 |
舉例 |
* |
表示前面的正則表達式會重複0次或多次 |
e\w*單詞中e後面可以有非空字符 |
+ |
表示前面的正則表達式重複至少1次 |
e\w+ 單詞中e後至少有一個非空白字符 |
? |
表示前面的正則表達式會重複0次或者1次 |
e\w? 單詞中e的後面最多有一個非空白字符 |
{n} |
重複固定的n次 |
e\w{1} 單詞中e後面只能有一個非空白字符 |
{n,} |
重複至少n次 |
e\w{1,} 等價 e\w+ e\w{0,} 等價於 e\w* e\w{0,1} 等價 e\w? |
{n,n} |
重複n到m次 |
e\w{1,10} 單詞中e後面至少1個,至多10個非空白字符 |
捕獲
代碼 |
說明 |
舉例 |
x |
y |
匹配x或者y |
(pattern) |
使用小括號指定一個自表達式,也叫分組 捕獲後會自動分配組號從1開始,可以改變優先級 |
|
\數字 |
匹配對應的分組 |
(very)\1 匹配 very very, 但是捕獲的組group是very |
(?:pattern |
如果僅僅是爲了改變優先級,就不需要捕獲分組 |
(?:w |
(?exp)(?’name’exp) |
分組捕獲,但是可以通過那麼訪問分組 Python語法必須是(?Pexp) |
|
斷言
代碼 |
說明 |
舉例 |
(?=exp) |
零寬度正預測先行斷言 斷言exp一定在匹配的右邊出現,也就是斷言後面一定跟着exp |
f(?=oo) f後面一定有oo出現 |
(?<=exp) |
零寬度正回顧後發斷言 斷言exp一定出現在匹配的左邊出現,也就是說前面一定有個exp前綴 |
(?<=f)ood,(?<=t)ook 分別匹配ood,ook,ook前一定有t出現 |
(?!exp) |
零寬度正預測先行斷言 斷言exp一定不會在匹配的右邊出現,也就是斷言後面一定不是exp |
\d{3}(?!\d)匹配3位數字斷言3位數字後面一定不是數字 foo(?!d) foo後面一定不是d |
(? |
零寬度正回顧後發斷言 斷言exp一定不會在匹配的左邊出現,也就是說前面一定不是exp |
(? |
貪婪模式
默認貪婪模式,也就是儘量多的匹配字符串
非貪婪模式,在重複的符號後面加上一個 ? 問號,就可以儘量的少匹配了。
代碼 |
說明 |
*? |
匹配任意次,但儘可能少重複 |
+? |
匹配至少1次,但是儘可能少重複 |
?? |
匹配0次或者1次,但儘可能少重複 |
{n,}? |
匹配至少n次,但儘可能少重複 |
{n,m}? |
匹配至少n次,至多m次,但儘可能少重複 |
引擎選項
代碼 |
說明 |
Python |
IgonreCase |
匹配時忽略大小寫 |
re.I re.IGNORECASE |
Singleline |
單行模式,可以匹配多有字符,包括\n |
re.Sre.DOTALL |
Multiline |
多行模式^行首、$行尾 |
re.M re.MULTLINE |
IgnorePatternWhitespace |
忽略表達式中的空白字符,如果要使用空白字符需轉義,#可以用來做註釋 |
re.X re.VERBOSE |
單行模式:將整個文本視爲一個字符串
. 可以匹配所有字符,包括換行符
^ 表示整個字符串的開頭,$表示整個字符串的結尾
多行模式:一行是一行
. 可以匹配除了換行符之外的字符
^ 表示行首 $ 表示行尾