Python正則表達(dá)式從匹配手機(jī)號(hào)到提取文本內(nèi)容的基礎(chǔ)用法詳解
在日常開發(fā)中,我們經(jīng)常會(huì)遇到這類需求:
- 從一段文字里找出手機(jī)號(hào);
- 從用戶輸入中提取郵箱;
- 把字符串里的數(shù)字統(tǒng)一替換掉;
- 按多種分隔符拆分文本;
- 從簡(jiǎn)單 HTML 片段中提取標(biāo)簽內(nèi)容。
這些場(chǎng)景都非常適合使用正則表達(dá)式。
Python 內(nèi)置的 re 模塊提供了一套完整的正則工具。本文會(huì)從幾個(gè)最常見的方法開始,結(jié)合示例代碼,帶你快速理解 Python 正則表達(dá)式的基本用法。
1. 引入 re 模塊
使用正則表達(dá)式之前,需要先導(dǎo)入 Python 的內(nèi)置模塊 re:
import re
re 是 regular expression 的縮寫,也就是正則表達(dá)式。
它可以幫助我們按照某種規(guī)則去匹配、查找、替換或分割字符串。
2. 使用 re.search 查找第一個(gè)匹配項(xiàng)
假設(shè)現(xiàn)在有一段文本:
text = "我的手機(jī)號(hào)是 13812345678,郵箱是 test@example.com"
我們想從里面找出手機(jī)號(hào),可以使用 re.search():
phone = re.search(r"1[3-9]\d{9}", text)
if phone:
print(f"找到手機(jī)號(hào):{phone.group()}")
輸出結(jié)果:
找到手機(jī)號(hào):13812345678
這里的正則表達(dá)式是:
r"1[3-9]\d{9}"
它的含義是:
1:手機(jī)號(hào)以數(shù)字1開頭;[3-9]:第二位是3到9之間的數(shù)字;\d{9}:后面再跟 9 個(gè)數(shù)字。
所以它可以匹配類似 13812345678 這樣的手機(jī)號(hào)。
需要注意的是,re.search() 只會(huì)返回第一個(gè)匹配結(jié)果。如果找到了,返回一個(gè)匹配對(duì)象;如果沒找到,返回 None。
因此實(shí)際使用時(shí),通常要先判斷:
if phone:
print(phone.group())
其中 group() 用來取出真正匹配到的字符串。
3. 使用 re.search 查找郵箱
我們還可以繼續(xù)從同一段文本中查找郵箱:
email = re.search(r"\w+@\w+\.\w+", text)
if email:
print(f"找到郵箱:{email.group()}")
輸出結(jié)果:
找到郵箱:test@example.com
這個(gè)正則表達(dá)式:
r"\w+@\w+\.\w+"
可以拆成幾部分理解:
\w+:匹配一個(gè)或多個(gè)字母、數(shù)字或下劃線;@:匹配郵箱中的@符號(hào);\w+:匹配域名主體;\.:匹配真正的點(diǎn)號(hào);\w+:匹配后綴。
為什么點(diǎn)號(hào)要寫成 \.?
因?yàn)樵谡齽t表達(dá)式里,. 有特殊含義,表示“任意字符”。如果我們想匹配普通的點(diǎn)號(hào),就需要用反斜杠進(jìn)行轉(zhuǎn)義。
4. 使用 re.findall 查找所有匹配項(xiàng)
re.search() 只會(huì)找第一個(gè)結(jié)果。
如果我們想找出所有匹配內(nèi)容,可以使用 re.findall()。
比如下面這段文本中有多個(gè)價(jià)格:
text = "價(jià)格:100元、200元、350元" prices = re.findall(r"\d+", text) print(prices)
輸出結(jié)果:
['100', '200', '350']
這里的正則表達(dá)式是:
r"\d+"
它表示匹配一個(gè)或多個(gè)數(shù)字。
findall() 會(huì)把所有匹配到的結(jié)果放進(jìn)一個(gè)列表中返回。
所以當(dāng)你需要“批量提取”內(nèi)容時(shí),findall() 非常常用。
5. 使用 re.sub 替換字符串
正則不僅能查找,還能替換。
比如我們想把日期中的數(shù)字全部替換成 X:
text = "今天是2026年02月19日" result = re.sub(r"\d+", "X", text) print(result)
輸出結(jié)果:
今天是X年X月X日
re.sub() 的基本格式是:
re.sub(pattern, replacement, string)
也就是:
pattern:要匹配的正則規(guī)則;replacement:替換成什么;string:在哪個(gè)字符串里替換。
在這個(gè)例子中,\d+ 會(huì)匹配連續(xù)數(shù)字,所以 2026、02、19 都會(huì)被替換成 X。
6. 使用 re.split 按多個(gè)分隔符拆分字符串
普通字符串的 split() 一次通常只能按一種分隔符拆分。
但實(shí)際數(shù)據(jù)經(jīng)常不那么規(guī)整,比如:
text = "張三;李四,王五 趙六"
這里的名字之間有分號(hào)、逗號(hào)和空格。
這時(shí)可以使用 re.split():
names = re.split(r"[;,\s]+", text) print(names)
輸出結(jié)果:
['張三', '李四', '王五', '趙六']
這個(gè)正則表達(dá)式:
r"[;,\s]+"
含義是:
[]:字符集合;;:匹配分號(hào);,:匹配逗號(hào);\s:匹配空白字符;+:匹配一次或多次。
也就是說,只要遇到分號(hào)、逗號(hào)或空白字符,就可以作為分隔符。
7. 常用正則符號(hào)速查
下面這些符號(hào)是寫正則表達(dá)式時(shí)最常見的基礎(chǔ)語法。
| 符號(hào) | 含義 |
|---|---|
. | 匹配任意字符,換行符除外 |
\d | 匹配數(shù)字,相當(dāng)于 [0-9] |
\D | 匹配非數(shù)字 |
\w | 匹配字母、數(shù)字、下劃線 |
\W | 匹配非字母、數(shù)字、下劃線 |
\s | 匹配空白字符 |
\S | 匹配非空白字符 |
^ | 匹配字符串開頭 |
$ | 匹配字符串結(jié)尾 |
* | 匹配 0 次或多次 |
+ | 匹配 1 次或多次 |
? | 匹配 0 次或 1 次 |
{n} | 匹配恰好 n 次 |
{n,m} | 匹配 n 到 m 次 |
[] | 字符集合 |
| ` | ` |
() | 分組 |
剛開始學(xué)習(xí)正則時(shí),不需要一次性記住所有復(fù)雜語法。
先掌握 \d、\w、\s、+、*、[]、^、$ 這些基礎(chǔ)符號(hào),就已經(jīng)可以解決很多實(shí)際問題。
8. 實(shí)戰(zhàn)一:驗(yàn)證手機(jī)號(hào)
前面我們用 search() 從文本中找手機(jī)號(hào)。
如果現(xiàn)在要判斷一個(gè)字符串是不是完整的手機(jī)號(hào),可以使用 re.match():
phone_pattern = r"^1[3-9]\d{9}$"
print(re.match(phone_pattern, "13812345678"))
這里的規(guī)則比前面更嚴(yán)格:
r"^1[3-9]\d{9}$"
其中:
^表示字符串開頭;$表示字符串結(jié)尾;1[3-9]\d{9}表示手機(jī)號(hào)規(guī)則。
加上 ^ 和 $ 之后,意味著整個(gè)字符串必須完整符合手機(jī)號(hào)格式。
如果不加它們,只要字符串中包含一段符合規(guī)則的內(nèi)容,也可能被匹配到。
9. 實(shí)戰(zhàn)二:驗(yàn)證郵箱
郵箱驗(yàn)證可以寫成這樣:
email_pattern = r"^[\w.+-]+@[\w-]+\.[\w.]+$" print(re.match(email_pattern, "test@example.com"))
這個(gè)表達(dá)式支持更常見的郵箱格式:
- 用戶名部分允許字母、數(shù)字、下劃線、點(diǎn)號(hào)、加號(hào)和短橫線;
- 中間必須有
@; - 域名部分允許字母、數(shù)字、下劃線和短橫線;
- 后綴部分允許字母、數(shù)字、下劃線和點(diǎn)號(hào)。
不過要注意,真實(shí)世界中的郵箱規(guī)則非常復(fù)雜。
在業(yè)務(wù)系統(tǒng)中,如果只是做基礎(chǔ)格式校驗(yàn),這樣的正則通常夠用;如果是嚴(yán)肅的注冊(cè)、登錄或郵件投遞場(chǎng)景,還需要結(jié)合郵件發(fā)送驗(yàn)證。
10. 實(shí)戰(zhàn)三:提取 HTML 標(biāo)簽內(nèi)容
代碼中還有一個(gè)提取 HTML 標(biāo)簽內(nèi)容的例子:
html = "<h1>標(biāo)題</h1><p>段落</p>" contents = re.findall(r"<\w+>(.*?)</\w+>", html) print(contents)
輸出結(jié)果:
['標(biāo)題', '段落']
這個(gè)正則表達(dá)式是:
r"<\w+>(.*?)</\w+>"
可以這樣理解:
<\w+>:匹配開始標(biāo)簽,比如<h1>、<p>;(.*?):提取標(biāo)簽中間的內(nèi)容;</\w+>:匹配結(jié)束標(biāo)簽,比如</h1>、</p>。
這里的 (.*?) 很關(guān)鍵。
其中:
()表示分組,findall()會(huì)優(yōu)先返回分組內(nèi)容;.表示任意字符;*表示 0 次或多次;?表示非貪婪匹配。
如果沒有 ?,正則可能會(huì)盡可能多地匹配內(nèi)容,導(dǎo)致結(jié)果不符合預(yù)期。
需要提醒的是,正則可以處理簡(jiǎn)單 HTML 片段,但不適合解析復(fù)雜 HTML 文檔。
如果是正式爬蟲或網(wǎng)頁解析任務(wù),更推薦使用 BeautifulSoup、lxml 這類專門的 HTML 解析庫(kù)。
11. search、match、findall、sub、split 怎么選
可以用下面這張表快速判斷:
| 方法 | 用途 |
|---|---|
re.search() | 查找第一個(gè)匹配項(xiàng) |
re.match() | 從字符串開頭開始匹配 |
re.findall() | 找出所有匹配內(nèi)容 |
re.sub() | 替換匹配內(nèi)容 |
re.split() | 按正則規(guī)則分割字符串 |
簡(jiǎn)單來說:
- 想找一個(gè),用
search(); - 想從開頭驗(yàn)證,用
match(); - 想提取全部,用
findall(); - 想替換文本,用
sub(); - 想按復(fù)雜分隔符切分,用
split()。
12. 為什么正則字符串前面常加 r
你會(huì)發(fā)現(xiàn)示例中的正則表達(dá)式大多寫成這樣:
r"\d+"
前面的 r 表示原始字符串。
它可以減少反斜杠轉(zhuǎn)義帶來的困擾。
比如正則中的 \d 表示數(shù)字,如果不用原始字符串,在更復(fù)雜的表達(dá)式中就很容易遇到雙重轉(zhuǎn)義問題。
所以寫 Python 正則時(shí),一個(gè)好習(xí)慣是:
正則表達(dá)式盡量使用
r"..."這種原始字符串形式。
小結(jié)
本文從幾個(gè)常見例子出發(fā),介紹了 Python re 模塊的基礎(chǔ)用法。
核心內(nèi)容包括:
- 用
re.search()查找手機(jī)號(hào)和郵箱; - 用
re.findall()提取所有數(shù)字; - 用
re.sub()替換匹配內(nèi)容; - 用
re.split()按多個(gè)分隔符拆分文本; - 理解常見正則符號(hào);
- 使用
re.match()驗(yàn)證手機(jī)號(hào)和郵箱格式; - 用分組和非貪婪匹配提取簡(jiǎn)單標(biāo)簽內(nèi)容。
正則表達(dá)式剛開始看起來有點(diǎn)像“符號(hào)密碼”,但它的核心思想其實(shí)很簡(jiǎn)單:
用一套規(guī)則去描述你想匹配的字符串。
當(dāng)你掌握了常用符號(hào)和幾個(gè)基礎(chǔ)方法之后,就可以用正則快速完成很多文本處理任務(wù)。
以上就是Python正則表達(dá)式從匹配手機(jī)號(hào)到提取文本內(nèi)容的基礎(chǔ)用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python正則表達(dá)式基礎(chǔ)用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過程
這篇文章主要為大家介紹了Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Python3簡(jiǎn)單爬蟲抓取網(wǎng)頁圖片代碼實(shí)例
這篇文章主要介紹了Python3簡(jiǎn)單爬蟲抓取網(wǎng)頁圖片代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
python如何實(shí)現(xiàn)簡(jiǎn)單調(diào)用c++庫(kù)
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)簡(jiǎn)單調(diào)用c++庫(kù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-03-03
python實(shí)現(xiàn)去除空格及tab換行符的方法
這篇文章主要為大家介紹了python實(shí)現(xiàn)去除空格及tab換行符的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
對(duì)python3 中方法各種參數(shù)和返回值詳解
今天小編就為大家分享一篇對(duì)python3 中方法各種參數(shù)和返回值詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12

