元字符 | 說明 | 舉例說明 |
---|---|---|
. | 匹配任意單個字符(換行符除外) | c.t 匹配:全部c和t之間隔一個字符的文本,如:cat, cbt, cct, ... |
[] | 匹配字符集合中的一個字符 | [abc] 匹配:a或b或c |
[^] | 對字符集合求非 | [^abc] 匹配:「非a非b非c」的任意字符 |
- | 定義一個區間 | [A-Z] 匹配:字母A,B,C,...,Z中的任意一個字符 |
\ | 對下一個字符轉義 | 須要轉義的字符: . [ ] ^ - \ * ? + ! { } $ ( ) |
元字符 | 說明 | 補充說明 |
---|---|---|
\d | 匹配任意一個數字字符 | 等價於[0-9] |
\D | \d 的反義,匹配一個任意非數字字符 | 等價於[^0-9] |
\w | 匹配任意一個「字母數字下劃線」字符 | 等價於[A-Za-z0-9_] (最新的實現中可匹配一個漢字) |
\W | \w 的反義,匹配任意一個「非字母非數字非下劃線」字符 | 等價於[^A-Za-z0-9_] |
\f | 匹配一個換頁符 | (屬於空白字符) |
\n | 匹配一個換行符 | (屬於空白字符) |
\r | 匹配一個回車符 | (屬於空白字符) |
\t | 匹配一個製表符 | (屬於空白字符) |
\v | 匹配一個垂直製表符 | (屬於空白字符) |
[\b] | 匹配一個退格字符 | 不經常使用(屬於空白字符) |
\s | 匹配一個空白字符 | 包括上面的:\f, \n, \r, \t, \v, 注意:不包括[\b] |
\S | \s 的反義,匹配任意一個非空白字符, | 非 \f, \n, \r, \t, \v, 的任意字符 |
\cx | 匹配一個控制字符 | 不經常使用,x爲一個字母,用來表示特定的控制符。如:\cM 匹配 Control-M或回車符 |
\xn | 用一個ASCII字符的十六進制值去匹配這個ASCII字符 | 不經常使用,n爲十六進制數表示 |
\0n | 用一個ASCII字符的八進制值去匹配這個ASCII字符 | 不經常使用,n爲八進制數表示 |
元字符 | 說明 | 舉例說明 |
---|---|---|
* | 匹配前一個字符(或子表達式)的 0 次或 屢次重複 | cat* 匹配:ca, cat, catt, cattt, ... |
+ | 匹配前一個字符(或子表達式)的 1 次或 屢次重複 | cat+ 匹配:cat, catt, cattt, ... |
? | 匹配前一個字符(或子表達式)的 0 次或 1 次重複 | cat? 匹配:ca, cat |
{n} | 匹配前一個字符(或子表達式)的 n 次重複 | cat{3} 匹配:cattttt |
{n, } | 匹配前一個字符(或子表達式)的至少 n 次重複 | cat{3,} 匹配:cattt, catttt, cattttttt, ... |
{n, m} | 匹配前一個字符(或子表達式)的 至少 n 次且至多 m 次重複 | cat{3,5} 匹配:cattt, catttt, cattttt |
*? | * 的懶惰版本 | cat*? 懶惰匹配:t 的 0 次或 屢次重複 |
+? | + 的懶惰版本 | cat+? 懶惰匹配:t 的 1 次或 屢次重複 |
{n, }? | {n, } 的懶惰版本 | cat{3,} 懶惰匹配:t 的至少 3 次重複 |
元字符 | 說明 | 補充說明 |
---|---|---|
\b | 匹配單詞的邊界 | \b 的判斷依據是:位置兩邊分別爲 \w 和 \W |
\B | \b 的反義,匹配非邊界 | \B 的判斷依據是:位置兩邊同爲 \w 或同爲 \W |
\< | 匹配單詞的開頭 | (擴展的正則表達式,egrep支持) |
\> | 匹配單詞的結束 | (擴展的正則表達式,egrep支持) |
^ | 匹配字符串的開頭 | 通常將整段文本視爲一個字符串,能夠和分行匹配模式組合使用 |
$ | 匹配字符串的結尾 | 通常將整段文本視爲一個字符串,能夠和分行匹配模式組合使用 |
\A | 匹配字符串的開頭 | 同 ^,但不受分行匹配影響 |
\z | 匹配字符串的結尾 | 同 $,但不受分行匹配影響 |
(?m) | 分行匹配模式 | (不少正則表達式實現不支持) |
元字符 | 說明 | 補充說明 |
---|---|---|
() | 定義一個子表達式 | 子表達式在一些文檔中有時也稱爲 pattern(模式) |
| | 邏輯或操做 | 通常用在子表達式內,如:(ab|cd) 表示匹配 ab 或 cd |
\1 | 匹配第1個子表達式 | \1 表示左起第1個子表達式,\2 表示第2個子表達式,依此類推 |
?(n) | 條件回溯(if then) | 若是第n個子表達式中的內容存在,則匹配判斷條件以後的內容 |
?(n)| | 條件回溯(if then else) | 相似上面,then 要執行的內容與 else 要執行的內容之間,用 | 隔開。 |
元字符 | 說明 | 舉例說明 |
---|---|---|
(?=) | 向前查找(原字符串中,真正匹配內容在前面,條件在後面) | \d+(?=a) 匹配:以 a 結尾的數字,但 a 自己不在返回文字中 |
(?<=) | 向後查找(原字符串中,真正匹配內容在後面,條件在前面) | (?<=a)\d+ 匹配:以 a 開頭的數字,但 a 自己不在返回文字中 |
(?!) | 負向前查找(將向前查找的「=」換成「!」) | 向前查找的否認形式,\d+(?!a) 匹配:不以 a 結尾的數字, |
(?<!) | 負向後查找(將向後查找的「=」換成「!」) | 向後查找的否認形式,(?<!a)\d+ 匹配:不以 a 開頭的數字, |
IP地址 | (((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3} ((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5])) |
Email地址 | (\w+\.)*\w+@(\w+\.)+[A-Za-z]+ |
URL地址 | https?://[-\w\.]+(:\d+)?(/([\w/_.]*)?)? |
HTML註釋 | <!-{2,}.*?-{2,}> |
Js註釋 | //.* |
驗證整數 | ^-?\d+$ |
驗證非負整數 | ^\d+$ |
驗證正整數 | ^\+?[1-9]\d*$ |
驗證浮點數 | ^(-?\d+)(\.\d+)?$ |
匹配unicode漢字 | [\u4e00-\u9fa5] (不包括中文標點符號) |
點擊標題,跳轉到下文詳細說明。javascript
點擊標題,跳轉到下文詳細說明。html
(1) 匹配單個字符java
示例文本python
sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls
正則表達式正則表達式
sales.
匹配結果數組
sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls
解釋:函數
匹配以「sales」開頭,後跟任意一個字符的6字符組合。ui
(2) 使用轉義字符spa
示例文本3d
sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls
正則表達式
sales.\.xls
匹配結果
sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls
解釋:
匹配以「sales」開頭,後跟任意一個字符,再後以「.xls」結尾的10字符組合。
(3) 匹配字符中的某一個
示例文本
a1.txt, b1.txt, c1.txt, d1.txt
正則表達式
[ac]1
匹配結果
a1.txt, b1.txt, c1.txt, d1.txt
解釋:
匹配以「a」或「c」開頭,後跟字符「1」的2字符組合。
(4) 特定字母可大小寫
示例文本
The phrase is RegEx or regex, but not regEx.
正則表達式
[Rr]eg[Ee]x
匹配結果
The phrase is RegEx or regex, but not regEx
解釋:
匹配 regex,其中第1個字符r大小寫皆可,第4個字符e大小寫皆可。
(5) 定義區間匹配
用法:
[a-z]可匹配全部小寫字母,[A-Z]可匹配全部大寫字母,[0-9]可匹配全部數字。
注意:若是要匹配全部大小寫字母,要寫成:[A-Za-z],而不能寫成:[A-z](由於其中會包含一些 ASCII符號)。
示例文本
a1.txt, b1.txt c2.txt, d3d.txt, ee.txt
正則表達式
[a-z][0-9].txt
匹配結果
a1.txt, b1.txt, c2.txt, d3d.txt, ee.txt
解釋:
匹配:第1個字符爲小寫字母,第2個字符爲數字,最後以「.txt」結尾。
(6) 組合使用
示例文本
background-color="#A2A2A2"; color="#000000"
正則表達式
#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]
匹配結果
background-color="#A2A2A2"; color="#000000"
解釋:
對於十六進制數,每位的定義範圍爲0~9,A,B,C,D,E,F,在上面的正則表達式中使用[A-Fa-f0-9], 重複6次,便可獲得一個6位的十六進制數的匹配。(在後面第3小節介紹完次數匹配後,本例有更爲簡潔的寫法。)
(7) 取非匹配
示例文本
a1.txt, b2.txt, C3.txt, cc.txt, dd.txt
正則表達式
[a-z][^0-9].txt
匹配結果
a1.txt, b2.txt, C3.txt, cc.txt, dd.txt
解釋:
匹配:第1個字符爲小寫字母,第2個字符不是數字,最後以「.txt」結尾。
(1) 匹配換行
說明:
在Windows下,換行用 \r\n 表示;在Linux下,換行僅用一個 \n 表示。
示例文本(Windows下文本)
001, Tom, Male 002, Tina, Female 003, Jack, Male
正則表達式
\r\n\r\n
匹配結果
001, Tom, Male 002, Tina, Female 003, Jack, Male
解釋:
匹配Windows下的2個換行,若是在Linux下,相同匹配的正則表達式可寫成:\n\n
(2) 匹配數字字符
示例文本
if(testArray[2] == 10) { ... }
正則表達式
testArray\[\d\]
匹配結果
if(testArray[2] == 10) { ... }
解釋:
對於數組外的方括號 「[」 和 「]」,要用轉義字符,中間的 \d 匹配單個數字字符。
(3) 匹配ASCII字符的十六進制值
示例文本
ABCDEABC
正則表達式
\x41
匹配結果
ABCDEABC
解釋:
\xn中的n表示ASCII字符的十六進制值,例如ASCII字符 「A」 的ASCII值寫成十六進制爲0x41, 則 \x41 可匹配文本中的全部 「A」 字符。
(1) 匹配 1 次或屢次重複: +
示例文本
The 1st email is to tom@initcircuit.com. The 2nd email is to jane@cnblogs.com. The 3rd email is to tim.brown@initcircuit.com.cn.
正則表達式
\w+@\w+.\w+
匹配結果
The 1st email is to tom@initcircuit.com. The 2nd email is to jane@cnblogs.com. The 3rd email is to tim.brown@initcircuit.com.cn.
解釋:
\w+ 能夠有效匹配一個或多個字母數字下劃線,因此能匹配出前兩個email地址。 但在第3個匹配時有點問題,因爲 \w 不包括「.」號,因此第3個email地址的@前面和@後面都只匹配了一部分,解決方案見下條目。
(2) 匹配 0 次或屢次重複: *
示例文本
The 1st email is to tom@initcircuit.com. The 2nd email is to jane@cnblogs.com. The 3rd email is to tim.brown@initcircuit.com.cn.
正則表達式
\w+[\w\.]*@[\w\.]+\.\w+
匹配結果
The 1st email is to tom@initcircuit.com. The 2nd email is to jane@cnblogs.com. The 3rd email is to tim.brown@initcircuit.com.cn.
解釋:
能夠把上面的正則表達式拆成5部分分別來看:\w+ [\w\.]* @ [\w\.]+ \.\w+
第1部分的 \w+ 表示必須以字母或數字開頭,不能有「.」開頭,這部分匹配上面的:tom, jane, tim。
第2部分的 [\w\.]* 表示能夠有0個或多個的「字母數字」或「.」號,這部分匹配上面的:.brown。
第3部分的 @ 直接匹配文中的 @。先跳過第4部分,直接看第5部分。
第5部分的 \.\w+ 表示先匹配一個「.」號,後面再跟1個或多個的字母數字,這部分匹配上面的:.com, .com, .cn。
最後看第4部分的 [\w\.]+,表示可匹配一個或多個的字母數字或「.」號,這部分匹配上面的:initcircuit, cnblogs, initcircuit.com。
(3) 匹配 0 次或 1 次 重複: ?
示例文本
The URL is http://www.initcircuit.com/, and https://www.initcircuit.com/.
正則表達式
https?://[\w\./]+/
匹配結果
The URL is http://www.initcircuit.com/, and https://www.initcircuit.com/.
解釋:
正則表達式中的 s? 可匹配 s 的 0 次或 1 次出現。
(4) 匹配重複的次數: {n}
示例文本
background-color="#A2A2A2"; color="#000000"
正則表達式
#[0-9A-Fa-f]{6}
匹配結果
background-color="#A2A2A2"; color="#000000"
解釋:
匹配一個十六進制位的6次重複。
(5) 匹配至少重複的次數: {n,}
示例文本
001: 123.01 002: 52.48 003: 1024.56
正則表達式
\d+: \d{3,}\.\d{2}
匹配結果
001: 123.01 002: 52.48 003: 1024.56
解釋:
中間的 \d{3,}\. 匹配:點號前至少有3位數字, 這樣就把大於100數字給匹配出來了。
(6) 匹配重複次數的區間: {n,m}
示例文本
2018-01-01 99/12/01 3-3-3 03-03-03
正則表達式
\d{2,4}[\-/]\d{1,2}[\-/]\d{1,2}
匹配結果
2018-01-01 99/12/01 3-3-3 03-03-03
解釋:
本例用於匹配合法的日期,最前面的\d{2,4}用於匹配年份, 用2位數或4位數表示年份均可以,中間的 [\-/] 表示日期分隔符,「-」或「/」均可以匹配(其中「-」前用了轉義符), 後面的 d{1,2} 表示月份,用1位或2位均可以匹配出來。(本例只是展現 {n,m} 的用法,匹配表達式寫法並不完美, 後面有匹配日期更好的正則表達式的寫法)
(7) 防止過分匹配,懶惰型次數匹配符: *?, +?, {n,}?
示例文本
The html is <p>abc</p> and <p>def</p>.
正則表達式
<p>.*</p>
匹配結果
The html is <p>abc<p> and <p>def<p>.
解釋:
因爲正則表達式中間的.*可匹配任意字符的任意屢次重複, 所以把本行的最前面1個<p>和最後的一個</p>中間的內容都一古腦兒地全都匹配了出來, 這不是咱們想要的結果。可以使用 * 的懶惰型版本 *? 來匹配,改進以下:
正則表達式
<p>.*?</p>
匹配結果
The html is <p>abc<p> and <p>def<p>.
解釋:
懶惰型版本 *? 在匹配任意次數的重複的字符時,會時時注意其後面的表達式 </p>,若是一旦發現後面的表達式</p>符合匹配條件,本身自己就中止繼續匹配了。因此在本例中, 只匹配到</p>以前的部分。
(1) 匹配單詞邊界
示例文本
There is a car on the card.
正則表達式
car
匹配結果
There is a car on the card.
解釋:
咱們只想匹配 car,不想匹配後面的 card, 此時須要使用單詞邊界匹配 \b,改進以下:
正則表達式
\bcar\b
匹配結果
There is a car on the card.
解釋:
單詞邊界匹配符 \b 判斷單詞邊界的依據是: 它的左右兩邊分別是一個 \w 和 一個 \W。注意:位置元字符 \b 僅匹配位置,其自己並不匹配任何實際出現的字符。 在本例中,car 單詞的開頭處,其左邊是一個空格(即\W),右邊是一個字母 c(即\w),符合 \b 的邊界判斷條件。car 單詞的結尾也相似,car 單詞結尾處,其左邊是一個字母 r(即\w),右邊是一個空格(即\W),亦符合 \b 的邊界判斷條件, 故2個 \b 的中間不分的 car 被匹配出來。
(2) 匹配字符串開頭與結尾
示例文本
something <html> blablabla </html> something else
正則表達式
<html>.*</html>
匹配結果
something <html> blablabla </html> something else
解釋:
若是咱們但願,整段文本只有當以<html>開頭時才匹配, 若以前有其餘內容則不匹配;一樣,整段文本只有以</html>結尾時才匹配,以後如有其餘內容則不匹配, 此時就須要用到 ^(字符串開頭)和 $(字符串結尾)匹配符了。改進以下:
正則表達式
^<html>.*</html>$
匹配結果
something <html> blablabla </html> something else
解釋:
這樣,上面的示例文本就不會有內容被匹配出來了。
(1) 子表達式
說明:
前面的「次數元字符」只能匹配1個字符的若干次重複, 若是咱們要匹配一個字符串的若干次重複,就須要用到子表達式。
示例文本
The abcabc can match, but not the abc.
正則表達式
(abc){2}
匹配結果
The abcabc can match, but not the abc.
解釋:
子表達式(abc)重複2次能夠被匹配出來。
(2) 匹配IP地址
示例文本
The IP address is 192.168.1.10.
正則表達式
(\d{1,3}\.){3}\d{1,3}
匹配結果
The IP address is 192.168.1.10.
解釋:
子表達式爲(\d{1,3}\.),表示1~3位數字後跟一個「.」號, 能夠匹配形如:「192.」或「1.」這樣的字符模式。以後的 {3} 表示重複3次,便可以把「192.168.1.」匹配出來了。 最後的 \d{1,3} 表示1~3位數字,能夠把最後的「.10」匹配出來。固然,這個正則表達式並不完美, 會把超過255的不合理的IP地址也匹配出來,後面的「經常使用正則表達式示例」會有更好的解決方案。
(3) 邏輯或的使用
示例文本
1111, 1920, 5279, 2099, 199
正則表達式
(19|20)\d{2}
匹配結果
1111, 1920, 5279, 2099, 199
解釋:
這裏只匹配以19或20開始的年份,子表達式中使用了「|」號, 匹配19或20,後面的 \d{2} 表示後面再跟2位數字。
(4) 子表達式的嵌套
說明:
這裏咱們用子表達式的嵌套來解決前面的IP地址的合理性問題。 咱們要找到255及如下的數字,有4種合理狀況:(1) 1位或2位數字;(2) 以1開頭的3位數字; (3) 以2開頭的3位數字,十位爲0~4的;(4) 以25開頭的3位數字,個位爲0~5的。
示例文本
192. 255. 10. 999.
正則表達式
\b((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.
匹配結果
192. 255. 10. 999.
解釋:
這個嵌套的正則表達式看上去很複雜,其實拆開來看仍是比較簡單的:
\b( (\d{1,2}) | (1\d{1,2}) | (2[0-4]\d) | (25[0-5]) )\.
其中,4個黑色文字的子表達式分別表示前述4種狀況的匹配, 它們之間用邏輯或並列嵌入到外層的一個子表達式中(紅色括號),最前面的 \b 匹配單詞邊界, 最後的 \. 匹配點號。
(5) 回溯引用
說明:
有時咱們想匹配文本中連續出現的2個重複單詞,而無論單詞內容是什麼, 這種需求只能用子表達式的回溯引用來實現。在回溯引用時,若正則表達式中有若干個子表達式, 則 \1 表示從左數起第1個子表達式,\2 表示第2個子表達式,依此類推。 在許多實現裏,\0 可用來表明整個正則表達式。
示例文本
There is a white white cat. The color of of the dog yellow.
正則表達式
\b(\w+)\b[ ]+\1
匹配結果
There is a white white cat. The color of of the dog yellow.
解釋:
正則表達式中,\b(\w+)\b 表示匹配1個單詞, [ ]+ 表示匹配其後的1個或多個空格,最後的 \1 就是回溯引用前面的子表達式 (\w+) 中匹配的內容, 若 (\w+) 匹配到 white,則 \1 也去匹配 white;若 (\w+) 匹配到 of,則 \1 也去匹配 of。
(6) 利用回溯匹配html配對標籤
示例文本
<h1>This line is right.</h1> <h2>This line is also right.</h2> <h1>Wrong!!!</h2>
正則表達式
<h([1-6])>.*?</h\1>
匹配結果
<h1>This line is right.</h1> <h2>This line is also right.</h2> <h1>Wrong!!!</h2>
解釋:
對於<h>標籤,其中數字只能配對出現, 故使用回溯子表達式,\1 表示前面子表達式 ([1-6]) 已匹配到的數字。另外,注意這裏使用了 *? 懶惰型次數匹配符。
(7) 條件回溯
說明:
有時咱們有這種需求,好比在 html 文件中, 咱們想要匹配全部被<span>...</span>包裹的標籤。但若是這個<span>被包裹在 <p>...</p>中,則把外層的<p>和</p>標籤中的內容也一塊兒匹配出來。
示例文本
<body> <span>something</span> <p><span>anything</span></p> <p class="abc"><span>everything</span></p> </body>
正則表達式
(<p\s*[^>]*>\s*)?<span>.*?</span>(?(1)\s*</p>)
匹配結果
<body>
<span>something</span>
<p><span>anything</span></p>
<p class="abc"><span>everything</span></p>
</body>
解釋:
這個正則表達式比較長,須要拆解開來分析:
(<p\s*[^>]*>\s*)? <span>.*?</span> (?(1)\s*</p>)
先看黑體顯示的第1個子表達式,這能夠匹配: <p>或<p class="abc">,其後的 ? 表示 0 次或 1 次匹配,即<p>標籤能夠出現1次,也能夠沒有。
其後的 <span>.*?</span> 部分比較簡單, 可匹配<span>標籤對及其中的文字內容,注意這裏用了懶惰型元字符 *? 匹配 0 個或多個字符。
最後是紅色括號中的條件回溯,紅字表示,若第1個子表達式有匹配, 則執行匹配後面的 \s*</p>部分,若第1個子表達式沒有出現匹配,則後面的 \s*</p>也不做匹配。
(1) 向前查找(lookahead)
說明:
有時咱們想匹配某種模式以前的內容, 但又不想把這個模式自己給匹配出來,這時可用到前向查找。以下例中,咱們想匹配冒號前的字符, 但又不想把冒號自己給匹配出來。
示例文本
http://www.initcircuit.com/ https://www.initcircuit.com/
正則表達式
.+(?=:)
匹配結果
http://www.initcircuit.com/ https://www.initcircuit.com/
解釋:
正則表達式中,.+ 表示匹配1個或多個任意字符,(?=:)爲匹配冒號, 但匹配結果僅爲冒號前的字符(不包含冒號),這就是「向前查找」的含義。
(2) 術語:消費(consume)
說明:
有些正則表達式文檔會使用「消費」(consume)這一術語, 表示「匹配且返回文本」的含義。在上面的向前查找(lookahead)中的例子中,冒號被匹配但不在返回文本中, 故稱爲:不消費。
(3) 向後查找(lookbehind)
示例文本
Tom: 80 Jane: 95 Jack: 100
正則表達式
(?<=:\s*)\d+
匹配結果
Tom: 80 Jane: 95 Jack: 100
解釋:
本例中,須要匹配冒號後的數字,因此用到了向後查找 (?<=) 元操做符,因爲冒號後還有若干個空格, 故用 \s* 予以匹配,但冒號和空格都不出如今匹配結果中, 只出現後面 \d+ 匹配的數字
(4) 取反先後查找(negtive lookahead/lookbehind)
說明:
在下面的例子中,要匹配a開頭的數字(但只取出數字)很容易, 只要使用普通的「向後查找」就能夠了。可是若是要匹配那些不以a開頭的純數字(以下例中的80和95), 就須要用到「取反先後查找」了。
示例文本
Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.
正則表達式
\b(?<!a)\d+\b
匹配結果
Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.
解釋:
這裏的 (?<!a) 就是取反向後查找, 把不是以 a 開頭的數字給匹配出來。注意先後使用的 \b 單詞邊界,若是不用 \b 會把文中的 1 和 2 也匹配出來。
(1) 概述
Python使用正則表達式須要導入 re 模塊,能夠直接調用 re的成員函數於對字符串進行正則表達式匹配,也能夠經過把正則表達式先編譯成一個「正則表達式對象」, 而後使用這個對象進行操做和匹配。這裏僅介紹第一種方法。
(2) re 的部分經常使用函數
findall(pattern, string [,flags]) | 在 string 中匹配 pattern,匹配結果用一列表返回 |
finditer(pattern, string [,flags]) | 同上,但返回一個迭代器 |
split(pattern, string [,maxsplit = 0]) | 根據 pattern 出現的位置拆分 string,返回字符串列表,參數 maxsplit 爲最大拆分次數,默認所有拆分。 |
sub(pattern, repl, string [,count = 0]) | 使用 repl 替換 string 中出現的 pattern,返回替換後的新字符串。參數 count 爲最大替換次數,默認所有替換。 |
subn(pattern, repl, string [,count = 0]) | 同上,但返回一個元組,其中包含新字符串和替換次數 |
compile(str [,flags]) | 編譯正則表達式對象,這裏暫不介紹 |
(3) 示例一(將日期匹配出來)
python代碼
import re text = 'The test date is from 2018/1/1 – 2018/12/31' patt = '(\d{4})/(\d{1,2})/(\d{1,2})' re.findall(text, patt)
執行結果
[('2018', '1', '1'), ('2018', '12', '31')]
解釋:
執行結果爲 re.findall 函數返回的匹配結果列表。 因爲正則表達式中使用了3個子表達式,故在結果中,把這3個子表達式的匹配結果分開放到了一個元組中。
(4) 示例二:將日期格式替換成歐洲格式(即:日/月/年)
python代碼
import re text = 'The test date is from 2018/1/1 – 2018/12/31' patt = '(\d{4})/(\d{1,2})/(\d{1,2})' re.sub(patt, r'\3\2\1', text)
執行結果
The test date is from 1/1/2018 - 31/12/2018
解釋:
執行結果爲 sub.re 函數返回的結果,其中 repl 用到了正則表達式中的子表達式回溯引用表示。
(1) 概述
在Js中,能夠經過 String 對象和 RegEx 對象實現正則表達式處理, 這裏僅介紹 String 對象的方法。注意在Js中,正則表達式首尾用兩個「/」來括起, 這樣可自動生成一個正則表達式對象,而不是雙引號或單引號(用引號的話,就是字符串對象了)。
(2) String 對象中關於正則表達式的函數
str.search(regexp) | 在 String 對象中查找匹配入參正則表達式 regexp,匹配成功則返回在字符串中首次匹配項的索引; 不然返回 -1 |
str.match(regexp) | 在 String 對象中查找匹配正則表達式 regexp,匹配成功則返回一個包含若干匹配信息的 Array(內容詳見下例二), 未匹配則返回 null |
str.replace(regexp|substr, newSubStr) | 將 String 對象內匹配到的 regexp 替換成 newSubStr,返回新字符串,原字符串不變。 |
str.split(regexp [,limit]) | 使用regexp描述的分隔符將一個 String 對象分割成字符串數組。 |
(3) 示例一(search使用)
Js代碼
var text = 'The fox, and the dog.'; // 生成1個String對象 var regex = /[^\w\s]/; // 匹配非字母和非空格 var idx = text.search(regex); console.log(idx); console.log(text[idx])
執行結果
> 7 > ","
解釋:
search 匹配到的第一個非字母和非空格是「,」, 故返回其索引值:7。
(4) 示例二(match使用)
Js代碼
var text = 'For more information, see Chapter 3.4.5.1'; var regex = /see (Chapter \d+(\.\d)*)/; // 不使用 g 標誌 var ary = text.match(regex); console.log(ary);
執行結果
> ["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1" index: 22, input: 'For more information, see Chapter 3.4.5.1']
解釋:
能夠看到返回 Array 中,各個子表達式的匹配。
Js代碼(regexp使用 g 標誌)
var text = 'For more information, see Chapter 3.4.5.1'; var regex = /see (Chapter \d+(\.\d)*)/g; // 使用 g 標誌 var ary = text.match(regex); console.log(ary);
執行結果
> ["see Chapter 3.4.5.1"]
解釋:
使用 g 標誌後,僅將總體匹配結果放入返回 Array 中。
(5) 示例三(replace使用)
Js代碼
var text = 'The fox, and the dog.'; var regex = /dog/; var newtext = text.replace(regex, 'cat'); console.log(newtext);
執行結果
> The fox, and the cat.
解釋:
replace 匹配到 dog 後,用 cat 替換。 新字符串經過返回值返回,原字符串不變。