Python正则表达式(正则、regular、re)讲解,及常用正则:匹配邮箱、身份证、手机号、IP地址、URL、HTML等
正則表達式(正則、regular、re)是 Python 中最常見的編程技巧,很多時候,一個好的正則表達式可以抵上幾十行代碼。比如:匹配(校驗)郵箱、身份證、手機號、IP地址、URL、HTML等。
正則表達式,其實就是一串特殊的字符序列,而這串字符序列蘊含著事先定義好的 模式 (規則),可以用于匹配、校驗其它的字符串(文本、網頁等)。
但想掌握正則表達式的難度在于,其包括了較多的 基礎模式語法 需要記憶,并且這些基礎模式語法可以進行組合,產生無窮的變化。
所以,不建議死記硬背正則的基礎模式語法,可以隨用隨查,使用多了,自然就會形成機械記憶了。
基礎模式語法
** 字符范圍匹配**
| A | 精準匹配單個字符 | A | a |
| x|y | 允許出現的2個字符 | y | n |
| [xyz] | 字符集合,允許出現集合內任意單個字符 | z | c |
| [a-z] [A-Z] [0-9] | 字符范圍 | a D 8 | A a A |
| [^xyz] [^0-9] | 集合內字符不允許出現 | 0 A | y 8 |
元字符
| \d | 匹配任意單個數字 | 8 | i |
| \D | 匹配\d規則之外的任意單個字符 | i | 8 |
| \w | 匹配任意單個字母數字下劃線 | Y | & |
| \W | 匹配\w之外的任意單個字符 | & | Y |
| \s | 匹配單個空格 | x | |
| \n | 匹配單個換行符 | x | |
| . | 匹配任意單個字符(換行符除外) | – | – |
| \. | 特殊字符,只匹配. | . | 1 |
多次重復匹配
| A{3} | 精準N次匹配 | AAA | AA |
| A{3,} | 最少出現N次 | AAA | AA |
| \d{3,5} | 約定出現最少次數與最大次數 | 1234 | 12 |
| \d* | 可以出現零次至無限次,相當于{0,} | 1234 | – |
| \d+ | 最少出現一次,相當于{1,} | 12 | |
| \d? | 最多出現一次,相當于{0,1} | 1 | 12 |
定位匹配
| ^A.* | 頭匹配 | ABC | CBA |
| .*A$ | 尾匹配 | CBA | ABC |
| ^A.*A$ | 全字匹 | ACCCA | ACCC |
正則匹配流程
在正則匹配之前,需要先將正則表達式編譯成正則表達式對象。所以,一個頻繁使用的正則表達式會事先完成編譯,以提高執行效率。
同時在 re.compiler(pattern[, flags]) 時,可選正則表達式的修飾符,來控制匹配的模式。
具體如下表所示:
| re.I | 使匹配對大小寫不敏感 |
| re.L | 做本地化識別(locale-aware)匹配 |
| re.M | 多行匹配,影響 ^ 和 $ |
| re.S | 使 . 匹配包括換行在內的所有字符 |
| re.U | 根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B |
| re.X | 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解 |
匹配
re.match(pattern, string, flags=0)
從字符串的起始位置匹配,如果不能起始位置匹配成功的話,則返回 None,這一點需要我們特別注意。
其中參數 flags 就是正則表達式的修飾符。
import reprint(re.match(r'hello', 'Hello world', re.I)) print(re.match(r'world', 'Hello world', re.I))<_sre.SRE_Match object at 0x7f2c7c626648> Nonere.search(pattern, string, flags=0)
與 match 方法不同,它可以掃描整個字符串,并返回第一成功的匹配。
import reprint(re.search(r'hello', 'Hello world', re.I)) print(re.search(r'world', 'Hello world', re.I))<_sre.SRE_Match object at 0x7fbcf9945648> <_sre.SRE_Match object at 0x7fbcf9945648>可以看到,search 方法成功找到了 world 字符串。
如果我們想輸出匹配的結果,可以使用 group 和 groups。
import reprint(re.search(r'world', 'Hello world', re.I).group(0)) print(re.search(r'(world)', 'Hello world', re.I).groups())world ('world',)這里有一個知識點就是 () 在正則表達式中應用給 groups 。
還有一點需要特別說明, 正則表達式匹配默認是 貪婪匹配 。
import reprint(re.match(r'^(\d+)(0*)$', '102300').groups()) print(re.match(r'^(\d+?)(0*)$', '102300').groups())('102300', '') ('1023', '00')由于\d+ 采用貪婪匹配,直接把后面的 0 全部匹配了,結果 0* 只能匹配空字符串了。
必須讓 \d+ 采用非貪婪匹配(也就是盡可能少匹配),才能把后面的 0 匹配出來,加個 ? 就可以讓 \d+ 采用。
match 和 search 只能匹配一次,如果想匹配所有,那么可以使用 findall 和 finditer 。
findall(string[, pos[, endpos]]
import re# 匹配數字 pattern = re.compile(r'\d+') result1 = pattern.findall('runoob 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10)print(result1) print(result2)['123', '456'] ['88', '12']finditer(pattern, string, flags=0)
import re# 匹配數字 it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group())12 32 43 3除了單純的匹配之外,還會有 分割 和 替換 的需求,所以下面介紹這兩種方法:
re.split(pattern, string[, maxsplit=0, flags=0])
import re print(re.split('\W+', 'runoob, runoob, runoob.'))['runoob', 'runoob', 'runoob', '']re.sub(pattern, repl, string, count=0, flags=0)
import redt = '2020-01-01' print(re.sub(r'\D', ' ', dt))2020 01 01常用正則表達式
15位: ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位: ^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
v4: \\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
v6: (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
最后,安利大家一本書《深入理解NLP的中文分詞:從原理到實踐》,讓你從零掌握中文分詞技術,踏入NLP的大門。
如果因為以上內容對你有所幫助,希望你能幫個忙,點個贊、評個論、轉個發,關個注。
此公眾號每周分享一篇干貨文章,實實在在把一個課題說明白,講清楚,望關注!
總結
以上是生活随笔為你收集整理的Python正则表达式(正则、regular、re)讲解,及常用正则:匹配邮箱、身份证、手机号、IP地址、URL、HTML等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【整理】3dsMax中J是什么命令?
- 下一篇: Endpoint Central自动化软