C#傳送騰訊企業郵箱
正則表示式
正則表示式的模式可以包含普通字元(包括轉義字元)、字元類和預定義字元類、邊界匹配符、重複限定復、選擇分支、分組和引用等。
一、普通字元和轉義字元
普通字元包括ASCII字元、Unicode字元和轉義字元。
正則表示式中的元字元如果想要作為普通字元使用,則需要轉義,例如 \$
二、預定義字元類
預定義字元 | 說明 |
\d | 數字,等價於[0-9] |
\D | 非數字,等價於[^0-9] |
\s | 空白字元,等價於[\t\n\r\f\v] |
\S | 非空白字元,等價於[^\t\n\r\f\v] |
\w | 單詞字元,等價於[a-zA-Z0-9_] |
\W | 非單詞字元,等價於[^a-zA-Z0-9_] |
三、常用的元字元相關說明和分類
為了能夠使使用者更加靈活地定製模式內容,正則表示式提供了 專門的“元字元”。
所謂的元字元,就是指那些在正則表示式裡具有特殊意義的專用字串,可以用來規定其前導字元(即位於元字元前面的那些字元)在目標物件中出現的模式。
以下為常用的元字元及說明:
元字元 |
描述 |
\ |
一般用於轉義字元 |
^ | 匹配目標的開始位置(或在多行模式下是行首) |
$ | 匹配目標的結束位置(或在多行模式下是行尾) |
. | 匹配出換行符外地任何字元(預設) |
[ | 開始字元類定義 |
] | 結束字元類定義 |
| | 開始一個可選分支 |
( | 子組的開始標記 |
) | 子組的結束標記 |
? | 量詞,表示0次或1次的匹配 |
* | 量詞,表示0次或多次的匹配 |
+ | 量詞,表示1次或多次的匹配 |
{ | 自定義量詞開始標記 |
} | 自定義量詞結束標記 |
模式在方括號內的部分稱為“字元類”。在一個字元類中僅有以下可用元字元:
元字元 | 描述 |
\ | 轉義字元 |
^ | 僅在作為第一個字元(方括號內)時,表明字元類取反 |
- | 標記字元範圍 |
四、邊界匹配符
表示式 | 匹配 |
---|---|
^ |
在字串開始的地方匹配,符號本身不匹配任何字元 |
$ |
在字串結束的地方匹配,符號本身不匹配任何字元 |
\b |
匹配一個單詞邊界,\b 匹配這樣的位置:它的前一個字元和後一個字元不全是(一個是,一個不是或不存在) \w,符號本身不匹配任何字元 |
\B |
匹配非單詞邊界,即左右兩邊都是\w 範圍或者左右兩邊都不是\w 範圍時的字元縫隙 |
\A |
字串開頭,和^的區別是:\A只匹配整個字串的開頭,^只匹配每一行的開頭 |
\Z | 字串結尾,和$的區別是:\Z只匹配整個字串的結尾,$只匹配每一行的結尾 |
例如表示式^aaa
在匹配xxx aaa xxx
時,匹配結果是:失敗。因為^
要求在字串開始的地方匹配。
表示式aaa$
在匹配xxx aaa xxx
時,匹配結果是:失敗。因為$
要求在字串結束的地方匹配。
表示式.\b.
在匹配@@@abc
時,匹配結果是:成功;匹配到的內容是@a
;匹配到的位置開始於2,結束於4。
表示式\bend\b
在匹配weekend,endfor,end
時,匹配結果是:成功;匹配到的內容是end
;匹配到的位置開始於15,結束於18。
\b 詳解請參考:https://www.cnblogs.com/litmmp/p/4925374.html
本標題部分內容來自:https://www.liujiangblog.com/course/python/73
部分來自書籍
五、重複限定符
修飾匹配次數的特殊符號{}
,不用重複書寫表示式就可以重複匹配。比如[abcd][abcd]
可以寫成[abcd]{2}
。
表示式 | 匹配 |
---|---|
{n} |
表示式重複n次,比如\d{2} 相當於\d\d ,a{3} 相當於aaa |
{m,n} |
表示式至少重複m次,最多重複n次。比如ab{1,3} 可以匹配ab 或abb 或abbb |
{m,} |
表示式至少重複m次,比如\w\d{2,} 可以匹配a12 ,_1111 ,M123 等等 |
? |
匹配表示式0次或者1次,相當於{0,1} ,比如a[cd]? 可以匹配a ,ac ,ad |
+ |
表示式至少出現1次,相當於{1,} ,比如a+b 可以匹配ab ,aab ,aaab 等等 |
* |
表示式出現0次到任意次,相當於{0,} ,比如\^*b 可以匹配b ,^^^b 等等 |
其中有些例子一定要注意!比如ab{1,3}
中重複的是b
而不是ab
,(ab){1,3}
這樣重複的才是ab
。表示式\^*b
中重複的是\^
而不是^
,要從左往右讀正則表示式,轉義符號有更高的優先順序,需要和後面的字元整體認讀。
表示式\d+\.?\d*
在匹配It costs $12.5
時,匹配的結果是:成功;匹配到的內容是12.5
;匹配到的位置開始於10,結束於14。
本標題內容來自:https://www.liujiangblog.com/course/python/73
六、匹配演算法:貪婪和非貪婪(懶惰)模式
1.貪婪性匹配演算法是指重複限定符會導致正則表示式引擎試圖儘可能多地重複前導字元,只有當這種重複會引起整個正則表示式匹配失敗時引擎才會進行回溯。
例如:
import re
str = '<book><title><td>python</td><td>java</td><td>php</td></title>/book>'
res = re.findall("<.+>",str)
print(res)
##輸出:['<book><title><td>python</td><td>java</td><td>php</td></title>/book>']
Python正則匹配演算法針對重複限定符,預設採用貪婪匹配演算法。所以返回結果並不是<book>
2.懶惰性匹配演算法
貪婪性演算法返回了最左邊的最長匹配。如果在重複限定福後面加厚最“?”,則正則表示式引擎使用懶惰性匹配演算法。
符號 | 說明 |
*? | 重複0或任意次,但儘可能少重複 |
+? | 重複1次或更多次,但儘可能少重複 |
?? | 重複0次或一次,但儘可能少重複 |
{n,m}? | 重複n到m次,但儘可能少重複 |
{n,}? | 重複n次以上,但儘可能少重複 |
七、選擇分支
在正則表示式中‘|’表示選擇,用於選擇匹配的多個可能的正則表示式中的一個。選擇符‘|’的優先順序最低,如果需要可以使用圓括號來限制選擇符的作業範圍。
中國的電話號碼一般為區號-電話號碼,區號為3位或4位數字,電話號碼位6位或8位數字。
re.findall(r"((0\d{2}|0\d{3})-(\d{8}|\d{6})","電話號碼021-62232333")
八、分組和引用
1.分組快取和引用
表示式在匹配時,表示式引擎會將小括號()
包含的表示式所匹配到的字串記錄下來。在獲取匹配結果的時候,小括號包含的表示式所匹配到的字串可以單獨獲取。這是一個非常有用也非常重要的特性。在實際應用場合中,當用某種邊界來查詢,而所要獲取的內容又不包含邊界時,必須使用小括號來指定所要的範圍。比如前面的<td>(.*?)</td>"
。
其實,"小括號包含的表示式所匹配到的字串"不僅是在匹配結束後才可以使用,在匹配過程中也可以使用。表示式後邊的部分,可以引用前面"括號內的子匹配已經匹配到的字串"。引用方法是\
加上一個數字。\1
引用第1對括號內匹配到的字串,\2
引用第2對括號內匹配到的字串……以此類推,如果一對括號內包含另一對括號,則外層的括號先排序號。換句話說,哪一對的左括號"("在前,那這一對就先排序號。舉例如下:
表示式('|")(.*?)(\1)
在匹配'Hello', "World"
時,匹配結果是:成功;匹配到的內容是'Hello'
。再次匹配下一個時,可以匹配到"World"
。這裡的(\1)
,動態的引用了('|")
匹配到的結果。(單雙引號)
表示式(\w)\1{4,}
在匹配aa bbbb abcdefg ccccc 111121111 999999999
時,匹配結果是:成功;匹配到的內容是ccccc
。再次匹配下一個時,將得到999999999
。這個表示式要求\w
範圍的字元至少重複5次,注意與\w{5,}
之間的區別。
\0則引用整個被匹配的正則表示式本身。
表示式<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>
在匹配<td id='td1' style="bgcolor:white"></td>
時,匹配結果是成功。如果<td>
與</td>
不配對,則會匹配失敗;如果改成其他配對,也可以匹配成功。這就是常用的HTML標籤匹配方法。
2.分組命名和引用
在Python中對組可以進行如下命名並引用:
(?P< name > group) #組命名
(?P=name) #引用命名組
m = re.search(r"(?P<Area>\d+)-(?P<No>\d+)","電話號碼:021-62232333") print(m.groupdict())
##輸出{'Area': '021', 'No': '62232333'}
3.分組的擴充套件語法
請參考:www.baidu.com。。。。。。。。。。。。。。。。。
九、常用的正則表示式
校驗數字的相關表示式:
功能 | 表示式 |
---|---|
數字 | ^[0-9]*$ |
n位的數字 | ^\d{n}$ |
至少n位的數字 | ^\d{n,}$ |
m-n位的數字 | ^\d{m,n}$ |
零和非零開頭的數字 | ^(0|[1-9][0-9]*)$ |
非零開頭的最多帶兩位小數的數字 | ^([1-9][0-9]*)+(.[0-9]{1,2})?$ |
帶1-2位小數的正數或負數 | ^(\-)?\d+(\.\d{1,2})?$ |
正數、負數、和小數 | ^(\-|\+)?\d+(\.\d+)?$ |
有兩位小數的正實數 | ^[0-9]+(.[0-9]{2})?$ |
有1~3位小數的正實數 | ^[0-9]+(.[0-9]{1,3})?$ |
非零的正整數 | ^[1-9]\d*$ |
非零的負整數 | ^-[1-9]\d*$ |
非負整數 | ^\d+$ |
非正整數 | ^-[1-9]\d*|0$ |
非負浮點數 | ^\d+(\.\d+)?$ |
非正浮點數 | ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ |
正浮點數 | ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ |
負浮點數 | ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ |
浮點數 | ^(-?\d+)(\.\d+)?$ |
校驗字元的相關表示式:
功能 | 表示式 |
---|---|
漢字 | ^[\u4e00-\u9fa5]{0,}$ |
英文和數字 | ^[A-Za-z0-9]+$ |
長度為3-20的所有字元 | ^.{3,20}$ |
由26個英文字母組成的字串 | ^[A-Za-z]+$ |
由26個大寫英文字母組成的字串 | ^[A-Z]+$ |
由26個小寫英文字母組成的字串 | ^[a-z]+$ |
由數字和26個英文字母組成的字串 | ^[A-Za-z0-9]+$ |
由數字、26個英文字母或者下劃線組成的字串 | ^\w+$ |
中文、英文、數字包括下劃線 | ^[\u4E00-\u9FA5A-Za-z0-9_]+$ |
中文、英文、數字但不包括下劃線等符號 | ^[\u4E00-\u9FA5A-Za-z0-9]+$ |
可以輸入含有^%&’,;=?$\” 等字元 |
[^%&’,;=?$\x22]+ |
禁止輸入含有~ 的字元 |
[^~\x22]+ |
特殊場景的表示式:
功能 | 表示式 |
---|---|
Email地址 | ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
域名 | [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? |
InternetURL | [a-zA-z]+://[^\s]* 或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
手機號碼 | ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ |
國內電話號碼 | \d{3}-\d{8}|\d{4}-\d{7} (0511-4405222、021-87888822) |
身份證號 | ^\d{15}|\d{18}$ (15位、18位數字) |
短身份證號碼 | ^([0-9]){7,18}(x|X)?$ 或^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ (數字、字母x結尾) |
帳號是否合法 | ^[a-zA-Z][a-zA-Z0-9_]{4,15}$ (字母開頭,允許5-16位元組,允許字母數字下劃線) |
密碼 | ^[a-zA-Z]\w{5,17}$ (以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線) |
強密碼 | ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ (必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間) |
日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
一年的12個月(01~09和1~12) | ^(0?[1-9]|1[0-2])$ |
一個月的31天(01~09和1~31) | ^((0?[1-9])|((1|2)[0-9])|30|31)$ |
xml檔案 | ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ |
雙位元組字元 | [^\x00-\xff] (包括漢字在內,可以用來計算字串的長度(一個雙位元組字元長度計2,ASCII字元計1)) |
空白行的正則表示式 | \n\s*\r (可以用來刪除空白行) |
HTML標記的正則表示式 | <(\S*?)[^>]*>.*?</\1>|<.*? /> (對於複雜的巢狀標記依舊無能為力) |
首尾空白字元的正則表示式 | ^\s*|\s*$或(^\s*)|(\s*$) (可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等)) |
騰訊QQ號 | [1-9][0-9]{4,} (騰訊QQ號從10000開始) |
中國郵政編碼 | [1-9]\d{5}(?!\d) (中國郵政編碼為6位數字) |
IP地址提取 | \d+\.\d+\.\d+\.\d+ (提取IP地址時有用) |
IP地址合法性判斷 | ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) |