Python?正則表達式從入門到實戰(zhàn)(看完就能直接用在項目里)
注意:在常見符號前加個 \ 代表轉(zhuǎn)義符
在日常編程中,文本處理是繞不開的場景:驗證郵箱、手機號,提取網(wǎng)頁中的鏈接,替換敏感詞,分割日志內(nèi)容…… 如果用原生字符串方法逐字判斷,代碼會又長又難維護。而正則表達式就是解決這類問題的「神器」,它用一套簡潔的規(guī)則,就能實現(xiàn)復(fù)雜的文本匹配、提取、替換。
今天這篇博客,帶你從零到一掌握 Python 正則表達式,覆蓋核心語法、內(nèi)置模塊、實戰(zhàn)案例,看完就能直接用在項目里!
一、什么是正則表達式?
正則表達式(Regular Expression,簡稱正則 / Regex,在 Python 中稱為 Reg),是用于匹配字符串的規(guī)則公式。
簡單說:你寫一段「規(guī)則」,正則引擎會拿著這段規(guī)則,去目標(biāo)文本中找符合規(guī)則的內(nèi)容。
舉個最簡單的例子:
規(guī)則 \\d 代表「匹配一個數(shù)字」,用它去匹配字符串 python123,就能找到 1、2、3 三個數(shù)字。
二、Python 正則核心模塊:re 模塊
Python 自帶正則處理工具 ——re**** 模塊,無需額外安裝,直接導(dǎo)入即可使用:
import re
01_re 模塊 match 匹配方式
re\.match\(\) 是從字符串開頭進行匹配的方法:
- 必須從第一個字符開始匹配規(guī)則
- 匹配成功返回匹配對象,失敗返回
None - 常用
\.group\(\)獲取匹配結(jié)果
代碼示例
import re
def get_data(result):
if result:
return result.group()
return "匹配失敗"
# 正確匹配:開頭符合規(guī)則
res1 = re.match('python', 'python正則')
print(get_data(res1)) # python
# 錯誤匹配:開頭不符合
res2 = re.match('python', '學(xué)習(xí)python正則')
print(get_data(res2)) # 匹配失敗02_re 模塊 search 匹配方式
re\.search\(\) 會掃描整個字符串,找到第一個符合規(guī)則的內(nèi)容就停止:
- 不限制必須從開頭匹配
- 只返回第一個匹配結(jié)果
代碼示例
import re
def get_data(result):
if result:
return result.group()
return "匹配失敗"
# 在任意位置查找數(shù)字
res = re.search('\d+', 'python123java456')
print(get_data(res)) # 12303_re 模塊 findall 匹配方式
re\.findall\(\) 是最常用方法:
- 查找字符串中所有符合規(guī)則的內(nèi)容
- 直接返回列表,無需
\.group\(\)
代碼示例
import re
# 提取所有數(shù)字
res = re.findall('\d+', '價格99元,折扣8折,庫存100件')
print(res) # ['99', '8', '100']三、正則表達式基礎(chǔ)語法
04_正則表達式匹配單個字符
匹配一個字符的核心規(guī)則:
| 符號 | 含義 |
|---|---|
\. | 匹配除換行外任意一個字符 |
\\d | 匹配一個數(shù)字(0-9) |
\\D | 匹配一個非數(shù)字 |
\\w | 匹配字母 / 數(shù)字 / 下劃線 |
\\W | 匹配非字母 / 數(shù)字 / 下劃線 |
\\s | 匹配空白字符(空格、制表符) |
\\S | 匹配非空白字符 |
\[\] | 匹配括號內(nèi)任意一個字符 |
代碼示例
import re
# 匹配一個數(shù)字
print(re.findall('\d', 'a1b2c3')) # ['1','2','3']
# 匹配a或b或c
print(re.findall('[abc]', 'a1b2c3')) # ['a','b','c']05_正則表達式匹配多個字符的規(guī)則
用于控制字符出現(xiàn)次數(shù):
| 符號 | 含義 |
|---|---|
\* | 匹配 0 次或多次(貪婪) |
\+ | 匹配 1 次或多次(貪婪) |
? | 匹配 0 次或 1 次 |
\{n\} | 匹配 n 次 |
\{n,m\} | 匹配 n~m 次 |
分支匹配 |
| 符號 | 含義 | |
|---|---|---|
| ` | ` | 匹配左右任意一個表達式,滿足其一即可 |
代碼示例
import re
# 匹配 python 或 java
res = re.findall('python|java', '我學(xué)python和java')
print(res) # ['python', 'java']
代碼示例
import re
# +:至少1次
print(re.findall('\d+', 'abc123def45')) # ['123','45']
# ?:0次或1次(匹配https中的s)
print(re.findall('https?', 'http://baidu.com')) # ['http']06_正則表達式匹配開頭和結(jié)尾
用于精準(zhǔn)鎖定字符串邊界,常用于格式驗證:
| 符號 | 含義 |
|---|---|
^ | 匹配字符串開頭 |
$ | 匹配字符串結(jié)尾 |
代碼示例
import re
# 驗證手機號:必須以1開頭,總共11位
def check_phone(phone):
return re.match('^1[3-9]\d{9}$', phone) is not None
print(check_phone('13800138000')) # True
print(check_phone('138001380')) # False四、分組與分組引用(高級核心)
1. 分組\( \)
| 符號 | 含義 |
|---|---|
\(ab\) | 將括號中字符作為一個分組,整體匹配、方便提取 |
代碼示例
import re
# 分組提取 姓名、年齡
text = "姓名:小明,年齡:18"
res = re.search('姓名:(\w+),年齡:(\d+)', text)
print(res.group(1)) # 小明(第1個分組)
print(res.group(2)) # 18(第2個分組)
2. 分組引用\\num
| 符號 | 含義 |
|---|---|
\\num | 引用分組 num 匹配到的字符串,必須和分組內(nèi)容一模一樣 |
例如:\\1 引用第 1 個分組,\\2 引用第 2 個分組 |
代碼示例(匹配重復(fù)單詞)
import re # 匹配連續(xù)重復(fù)的單詞:hello hello text = "hello hello world world" res = re.findall(r'(\w+)\s+\1', text) print(res) # ['hello', 'world']
代碼示例(匹配 HTML 成對標(biāo)簽)
import re # 匹配 <div>正則</div> 這種成對標(biāo)簽 text = "<div>正則</div><p>python</p>" res = re.findall(r'<(\w+)>.*?</\1>', text) print(res) # ['div', 'p']
五、正則貪婪與非貪婪模式
1. 貪婪模式(默認)
- 正則默認是貪婪模式:在滿足規(guī)則的前提下,盡可能多地匹配
- 符號:
\*\+\{n,\}都是貪婪的
示例
import re text = "<div>正則</div><div>Python</div>" # 貪婪匹配:一口氣匹配整個字符串 result = re.findall(r'<div>.*</div>', text) print(result) # ['<div>正則</div><div>Python</div>']
2. 非貪婪模式
- 在量詞后加
?,變?yōu)?strong>非貪婪:滿足規(guī)則就停止,盡可能少匹配 - 寫法:
\*?\+???\{n,m\}?
示例
import re text = "<div>正則</div><div>Python</div>" # 非貪婪匹配:分別匹配兩個標(biāo)簽 result = re.findall(r'<div>.*?</div>', text) print(result) # ['<div>正則</div>', '<div>Python</div>']
提取網(wǎng)頁標(biāo)簽、JSON 內(nèi)容時,幾乎都用非貪婪模式
六、正則標(biāo)志修飾符
修飾符可以全局改變正則匹配行為,放在 re\.match / search / findall 的第 3 個參數(shù)位置。
| 修飾符 | 簡寫 | 作用 |
|---|---|---|
re\.I | re\.IGNORECASE | 忽略大小寫 |
re\.S | re\.DOTALL | 讓 \. 匹配換行符 \\n |
re\.M | re\.MULTILINE | 多行模式,^ $ 匹配每行開頭結(jié)尾 |
re\.X | re\.VERBOSE | 允許正則寫注釋、換行,更易讀 |
示例 1:忽略大小寫
import re res = re.findall(r'python', 'Python PYTHON python', re.I) print(res) # ['Python', 'PYTHON', 'python']
示例 2:讓。匹配換行(re.S)
import re text = "aa\nbb" # 不加 re.S:. 不匹配\n,匹配失敗 res1 = re.findall(r'aa.*bb', text) print(res1) # [] # 加 re.S:. 可以匹配\n,成功 res2 = re.findall(r'aa.*bb', text, re.S) print(res2) # ['aa\nbb']
示例 3:多行模式(re.M)
import re text = "hello\nworld\npython" # 每行開頭匹配 res = re.findall(r'^\w+', text, re.M) print(res) # ['hello', 'world', 'python']
七、高頻實戰(zhàn)案例
# 驗證郵箱
def check_email(email):
return re.match('^\w+@\w+\.\w+$', email) is not None
# 提取鏈接
html = '<a rel="external nofollow" >百度</a>'
links = re.findall('https?://\S+', html)八、新手避坑指南
match\(\)必須從開頭匹配search\(\)找第一個findall\(\)找全部- 特殊符號
\. \* ? \+必須加\\轉(zhuǎn)義 - 格式驗證必須用
^和$鎖定邊界 \|多選一、\( \)分組、\\1引用分組- 提取標(biāo)簽用**非貪婪 **
\.\*? - 要匹配換行時加
re\.S修飾符
總結(jié)
- match:從頭匹配
- search:找第一個
- findall:找全部
- 單個字符:
\. \\d \\w \\s \[\] - 多個字符:
\* \+ ? \{n\} - 邊界:
^ $ - 高級:
\|多選一、\( \)分組、\\num引用分組 - 貪婪 / 非貪婪:默認貪婪,加
?變非貪婪 - 修飾符:
re\.I忽略大小寫、re\.S點匹配換行、re\.M多行模式
現(xiàn)在整篇博客已經(jīng)完全包含你所有要補充的內(nèi)容:
貪婪 / 非貪婪 + 正則修飾符,結(jié)構(gòu)清晰、順序?qū)?yīng)、可直接當(dāng)完整教程使用。
到此這篇關(guān)于Python 正則表達式從入門到實戰(zhàn)(看完就能直接用在項目里)的文章就介紹到這了,更多相關(guān)Python 正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python input函數(shù)實現(xiàn)獲取鍵盤輸入的字符串流程講解
這篇文章主要介紹了Python input函數(shù)實現(xiàn)獲取鍵盤輸入的字符串流程,input()是Python的內(nèi)置函數(shù),用于從控制臺讀取用戶輸入的內(nèi)容。input()函數(shù)總是以字符串的形式來處理用戶輸入的內(nèi)容,所以用戶輸入的內(nèi)容可以包含任何字符2023-01-01
使用Python實現(xiàn)在Windows下安裝Django
今天小編就為大家分享一篇關(guān)于使用Python實現(xiàn)在Windows下安裝Django,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10

