1. 程式人生 > 程式設計 >Python驗證的50個常見正則表示式

Python驗證的50個常見正則表示式

什麼是正則表示式?

正則表示式(Regular Expression)通常被用來檢索、替換那些符合某個模式(規則)的文字。

此處的Regular即是規則、規律的意思,Regular Expression即“描述某種規則的表示式”之意。

本文收集了一些常見的正則表示式用法,方便大家查詢取用,並在最後附了詳細的正則表示式語法手冊。

案例包括:「郵箱、身份證號、手機號碼、固定電話、域名、IP地址、日期、郵編、密碼、中文字元、數字、字串」

python如何支援正則?

我用的是python來實現正則,並使用Jupyter Notebook編寫程式碼。

Python通過re模組支援正則表示式,re 模組使 Python 語言擁有全部的正則表示式功能。

這裡要注意兩個函式的使用:

re.compile用於編譯正則表示式,生成一個正則表示式( Pattern )物件;

.findall用於在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

# 匯入re模組
import re

1.郵箱

包含http://www.cppcns.com大小寫字母,下劃線,阿拉伯數字,點號,中劃線

表示式:

[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)

案例:

pattern = re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)")

strs = '我的私人郵箱是[email protected],公司郵箱是[email protected],麻煩登記一下?'
result = pattern.findall(strs)

print(result)

['[email protected]','[email protected]']

2. 身份證號

xxxxxx yyyy MM dd 375 0 十八位

  • 地區:[1-9]\d{5}
  • 年的前兩位:(18|19|([23]\d)) 1800-2399
  • 年的後兩位:\d{2}
  • 月份:((0[1-9])|(10|11|12))
  • 天數:(([0-2][1-9])|10|20|30|31) 閏年不能禁止29+
  • 三位順序碼:\d{3}
  • 兩位順序碼:\d{2}
  • 校驗碼:[0-9Xx]

表示式:

[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]

案例:

pattern = re.compile(r"[1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]")

strs = '小明的身份證號碼是342623198910235163,手機號是13987692110'
result = pattern.findall(strs)

print(result)

['342623198910235163']

3. 國內手機號碼

手機號都為11位,且以1開頭,第二位一般為3、5、6、7、8、9 ,剩下八位任意數字
例如:13987692110、15610098778

表示式:

1(3|4|5|6|7|8|9)\d{9}

案例:

pattern = re.compile(r"1[356789]\d{9}")

strs = '小明的手機號是13987692110,你明天打給他'
result = pattern.findall(strs)

print(result)

['13987692110']

4. 國內固定電話

區號3~4位,號碼7~8位

例如:0511-1234567、021-87654321

表示式:

\d{3}-\d{8}|\d{4}-\d{7}

案例:

pattern = re.compile(r"\d{3}-\d{8}|\d{4}-\d{7}")

strs = '0511-1234567是小明家的電話,他的辦公室電話是021-87654321'
result = pattern.findall(strs)

print(result)

['0511-1234567','021-87654321']

5. 域名

包含http:\\或https:\\

表示式:

(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)

案例:

pattern = re.compile(r"(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,6}(?:\/)")

strs = 'Python官網的網址是https://www.python.org/'
result = pattern.findall(strs)

print(result)

['https://www.python.org/']

6. IP地址

IP地址的長度為32位(共有2^32個IP地址),分為4段,每段8位,用十進位制數字表示

每段數字範圍為0~255,段與段之間用句點隔開 

表示式:

((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)www.cppcns.com.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

案例:

pattern = re.compile(r"((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))")

strs = '''請輸入合法IP地址,非法IP地址和其他字元將被過濾!
增、刪、改IP地址後,請儲存、關閉記事本!
192.168.8.84
192.168.8.85
192.168.8.86
0.0.0.1
256.1.1.1
192.256.256.256
192.255.255.255
aa.bb.cc.dd'''

result = pattern.findall(strs)

print(result)

['192.168.8.84','192.168.8.85','192.168.8.86','0.0.0.1','56.1.1.1','192.255.255.255']

7. 日期

常見日期格式:yyyyMMdd、yyyy-MM-dd、yyyy/MM/dd、yyyy.MM.dd

表示式:

\d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}

案例:

pattern = re.compile(r"\d{4}(?:-|\/|.)\d{1,2}")

strs = '今天是2020/12/20,去年的今天是2019.12.20,明年的今天是2021-12-20'
result = pattern.findall(strs)

print(result)

['2020/12/20','2019.12.20','2021-12-20']

8. 國內郵政編碼

我國的郵政編碼採用四級六位數編碼結構

前兩位數字表示省(直轄市、自治區)

第三位數字表示郵區;第四位數字表示縣(市)

最後兩位數字表示投遞局(所)

表示式:

[1-9]\d{5}(?!\d)

案例:

pattern = re.compile(r"[1-9]\d{5}(?!\d)")

strs = '上海靜安區郵編是200040'
result = pattern.findall(strs)

print(result)

['200040']

9. 密碼

密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線)

表示式:

[a-zA-Z]\w{5,17}

強密碼(以字母開頭,必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間)

表示式:

[a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}

pattern = re.compile(r"[a-zA-Z]\w{5,17}")

strs = '密碼:q123456_abc'
result = pattern.findall(strs)

print(result)

['q123456_abc']

pattern = re.compile(r"[a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}")

strs = '強密碼:q123456ABc,弱密碼:q123456abc'
result = pattern.findall(strs)

print(result)

['q123456ABc,']

10. 中文字元

表示式:

[\u4e00-\u9fa5]

案例:

pattern = re.compile(r"[\u4e00-\u9fa5]")

strs = 'apple:蘋果'
result = pattern.findall(strs)

print(result)

['蘋','果']

11. 數字

  • 驗證數字:^[0-9]*$
  • 驗證n位的數字:^\d{n}$
  • 驗證至少n位數字:^\d{n,}$
  • 驗證m-n位的數字:^\d{m,n}$
  • 驗證零和非零開頭的數字:^(0|[1-9][0-9]*)$
  • 驗證有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
  • 驗證有1-3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
  • 驗證非零的正整數:^\+?[1-9][0-9]*$
  • 驗證非零的負整數:^\-[1-9][0-9]*$
  • 驗證非負整數(正整數 + 0) ^\d+$
  • 驗證非正整數(負整數 + 0) ^((-\d+)|(0+))$
  • 整數:^-?\d+$
  • 非負浮點數(正浮點數 + 0):^\d+(\.\d+)?$
  • 正浮點數 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  • 非正浮點數(負浮點數 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
  • 負浮點數 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
  • 浮點數 ^(-?\d+)(\.\d+)?$

12. 字串

  • 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}程式設計客棧$
  • 長度為3-20的所有字元:^.{3,20}$
  • 由26個英文字母組成的字串:^[A-Za-z]+$
  • 由26個大寫英文字母組成的字串:^[A-Z]+$
  • 由26個小寫英文字母組成的字串:^[a-z]+$
  • 由數字和26個英文字母組成的字串:^[A-Za-z0-9]+$
  • 由數字、26個英文字母或者下劃線組成的字串:^\w+$ 或 ^\w{3,20}$
  • 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  • 中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  • 可以輸入含有^%&',;=?$\”等字元:`[^%&',;=?$\x22]+`
  • 禁止輸入含有~的字元:[^~\x22]+

附:正則表示式語法詳解

字元 描述
\ 將下一個字元標記為一個特殊字元(File Format Escape,清單見本表)、或一個原義字元(Identity Escape,有^$()*+?.[{|共計12個)、或一個向後引用(backreferences)、或一個八進位制轉義符。例如,“n”匹配字元“n”。“\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。
^ 匹配輸入字串的開始位置
$ 匹配輸入字串的結束位置
* 匹配前面的子表示式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價於{0,}。
+ 匹配前面的子表示式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。
? 匹配前面的子表示式零次或一次。例如,“do(es)?”可以匹配“does”中的“do”和“does”。?等價於{0,1}。
{n} n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。
{n,} n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。
{n,m} m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。
? 非貪心量化(Non-greedy quantifiers):當該字元緊跟在任何一個其他重複修飾符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是「非」貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。
. 匹配除“\r”“\nwww.cppcns.com”之外的任何單個字元。要匹配包括“\r”“\n”在內的任何字元,請使用像“(.\|\r\|\n)”的模式。
(pattern) 匹配pattern並獲取這一匹配的子字串。該子字串用於向後引用。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在jscript中則使用$0…$9屬性。要匹配圓括號字元,請使用“\(”或“\)”。可帶數量字尾。
(?:pattern) 匹配pattern但不獲取匹配的子字串(shy groups),也就是說這是一個非獲取匹配,不儲存匹配的子字串用於向後引用。這在使用或字元“(\|)”來組合一個模式的各個部分是很有用。例如“industr(?:y\|ies)”就是一個比“industry\|industries”更簡略的表示式。
(?=pattern) 正向肯定預查(look ahead positive assert),在任何匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95\|98\|NT\|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
(?!pattern) 正向否定預查(negative assert),在任何不匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如“Windows(?!95\|98\|NT\|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始
(?<=pattern) 反向(look behind)肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95\|98\|NT\|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern) 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95\|98\|NT\|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x\|y 沒有包圍在()裡,其範圍是整個正則表示式。例如,“z\|food”能匹配“z”或“food”。“(?:z\|f)ohttp://www.cppcns.comod”則匹配“zood”或“food”。
[xyz] 字元集合(character class)。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。特殊字元僅有反斜線\保持特殊含義,用於轉義字元。其它特殊字元如星號、加號、各種括號等均作為普通字元。脫字元^如果出現在首位則表示負值字元集合;如果出現在字串中間就僅作為普通字元。連字元 - 如果出現在字串中間表示字元範圍描述;如果如果出現在首位(或末尾)則僅作為普通字元。右方括號應轉義出現,也可以作為首位字元出現。
[^xyz] 排除型字元集合(negated character classes)。匹配未列出的任意字元。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字元範圍。匹配指定範圍內的任意字元。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。
[^a-z] 排除型的字元範圍。匹配任何不在指定範圍內的任意字元。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。
[:name:] 增加命名字元類(named character class)中的字元到表示式。只能用於「方括號表示式」。
[=elt=] 增加當前locale下排序(collate)等價於字元“elt”的元素。例如,[=a=]可能會增加ä、、、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、 。只能用於方括號表示式。
[.elt.] 增加排序元素elt到表示式中。這是因為某些排序元素由多個字元組成。例如,29個字母表的西班牙語, "CH"作為單個字母排在字母C之後,因此會產生如此排序“cinco,credo,chispa”。只能用於方括號表示式。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字元。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字元。控制字元的值等於x的值最低5位元(即對3210進位制的餘數)。例如,\cM匹配一個Control-M或回車符。\ca等效於\u0001,\cb等效於\u0002,等等…
\d 匹配一個數字字元。等價於[0-9]。注意Unicode正則表示式會匹配全形數字字元。
\D 匹配一個非數字字元。等價於[^0-9]。
\f 匹配一個換頁符。等價於\x0c和\cL。
\n 匹配一個換行符。等價於\x0a和\cJ。
\r 匹配一個回車符。等價於\x0d和\cM。
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。注意Unicode正則表示式會匹配全形空格符。
\S 匹配任何非空白字元。等價於[^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於\x09和\cI。
\v 匹配一個垂直製表符。等價於\x0b和\cK。
\w 匹配包括下劃線的任何單詞字元。等價於“[A-Za-z0-9_]”。注意Unicode正則表示式會匹配中文字元。
\W 匹配任何非單詞字元。等價於“[^A-Za-z0-9_]”。
\xnn 十六進位制轉義字元序列。匹配兩個十六進位制數字nn表示的字元。例如,“\x41”匹配“A”。“\x041”則等價於“\x04&1”。正則表示式中可以使用ASCII編碼。.
\num 向後引用(back-reference)一個子字串(substring),該子字串與正則表示式的第num個用括號圍起來的捕捉群(capture group)子表示式(subexpression)匹配。其中num是從1開始的十進位制正整數,其上限可能是9、31、99,甚至無限。例如:“(.)\1”匹配兩個連續的相同字元。
\n 標識一個八進位制轉義值或一個向後引用。如果\n之前至少n個獲取的子表示式,則n為向後引用。否則,如果n為八進位制數字(0-7),則n為一個八進位制轉義值。
\nm 3位八進位制數字,標識一個八進位制轉義值或一個向後引用。如果\nm之前至少有nm個獲得子表示式,則nm為向後引用。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。如果前面的條件都不滿足,若n和m均為八進位制數字(0-7),則\nm將匹配八進位制轉義值nm。
\nml 如果n為八進位制數字(0-3),且m和l均為八進位制數字(0-7),則匹配八進位制轉義值nml。
\un Unicode轉義字元序列。其中n是一個用四個十六進位制數字表示的Unicode字元。例如,\u00A9匹配著作權符號(©)。

優先權

優先權 符號
最高 \
()、(?:)、(?=)、[]
*、+、?、{n}、{n,}、{n,m}
^、$、中介字元
次最低 串接,即相鄰字元連線在一起
最低 \|

總結

到此這篇關於Python驗證的50個常見正則表示式的文章就介紹到這了,更多相關Python驗證正則表示式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!