什么是正則表達(dá)式 ?
正則表達(dá)式是一組由字母和符號組成的特殊文本,它可以用來從文本中找出滿足你想要的格式的句子。
一個正則表達(dá)式是一種從左到右匹配主體字符串的模式,常使用縮寫的術(shù)語“regex”或“regexp”。
1. 正則表達(dá)式的基本語法
1.1 字符匹配
.
:匹配任意單個字符(除了換行符)。\d
:匹配數(shù)字,等價于[0-9]
。\D
:匹配非數(shù)字,等價于[^0-9]
。\w
:匹配字母、數(shù)字或下劃線,等價于[a-zA-Z0-9_]
。\W
:匹配非字母、數(shù)字或下劃線,等價于[^a-zA-Z0-9_]
。\s
:匹配空白字符,包括空格、制表符和換行符。\S
:匹配非空白字符。
1.2 字符集
[abc]
:匹配a
、b
或c
中的任意一個字符。[^abc]
:匹配除a
、b
、c
之外的任意字符。[a-z]
:匹配小寫字母中的任意一個字符。[0-9]
:匹配數(shù)字中的任意一個字符。
1.3 量詞
*
:匹配前面的字符零次或多次。
+
:匹配前面的字符一次或多次。
?
:匹配前面的字符零次或一次。
{n}
:匹配前面的字符恰好n次。
{n,}
:匹配前面的字符至少n次。
{n,m}
:匹配前面的字符至少n次,但不超過m次,一個范圍。
1.4 邊界匹配
^
:匹配字符串的開始位置。$
:匹配字符串的結(jié)束位置。\b
:匹配單詞邊界。\B
:匹配非單詞邊界。
2. 正則表達(dá)式示例
2.1 基本匹配示例
下面是一些Python中使用正則表達(dá)式的基本示例。
示例 1:匹配郵箱地址
import re
# 正則表達(dá)式
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
# 測試郵箱
emails = ["test@example.com", "invalid-email@", "user123@domain.co.uk"]
for email in emails:
? ? if re.match(pattern, email):
? ? ? ? print(f"{email} 是有效的郵箱")
? ? else:
? ? ? ? print(f"{email} 不是有效的郵箱")
解讀
^
?- 表示匹配字符串的開始位置,確保電子郵件地址從這里開始[a-zA-Z0-9._%+-]+
?- 匹配電子郵件地址中的用戶名部分:
[a-zA-Z0-9._%+-]
:允許的字符集
a-zA-Z
:所有大小寫字母0-9
:所有數(shù)字.
:點號_
:下劃線%
:百分號+
:加號-
:減號 / 連字符+
:表示前面的字符集可以出現(xiàn) 1 次或多次
@
?- 匹配電子郵件地址中的 @符號,這是郵箱地址的必備元素[a-zA-Z0-9.-]+
?- 匹配域名的主部分(如 gmail、yahoo、company 等):
- 字母、數(shù)字
.
:點號(用于子域名,如mail.yahoo.com)-
:連字符(某些域名中允許)
+
:表示前面的字符集可以出現(xiàn) 1 次或多次
\.
?- 匹配域名中的點號(如.com、.org 中的點),這里用反斜杠轉(zhuǎn)義,因為點在正則中有特殊含義[a-zA-Z]{2,}
?- 匹配頂級域名(如 com、org、cn 等):
[a-zA-Z]
:只允許字母{2,}
:表示至少需要 2 個字符(如 cn、uk 等)
$
?- 表示匹配字符串的結(jié)束位置,確保電子郵件地址在這里結(jié)束
運(yùn)行結(jié)果
test@example.com 是有效的郵箱
invalid-email@ 不是有效的郵箱
user123@domain.co.uk 是有效的郵箱
2.2 復(fù)雜匹配示例
示例 2:匹配手機(jī)號碼
import re
# 正則表達(dá)式
pattern = r'^\+?(\d{1,3})?[-.\s]?(\d{10})$'
# 測試手機(jī)號碼
phone_numbers = ["+123-4567890123", "4567890123", "12345", "123-456-7890"]
for number in phone_numbers:
? ? if re.match(pattern, number):
? ? ? ? print(f"{number} 是有效的手機(jī)號碼")
? ? else:
? ? ? ? print(f"{number} 不是有效的手機(jī)號碼")
運(yùn)行結(jié)果
+123-4567890123 是有效的手機(jī)號碼
4567890123 是有效的手機(jī)號碼
12345 不是有效的手機(jī)號碼
123-456-7890 不是有效的手機(jī)號碼
2.3 替換示例
示例 3:替換文本中的特定內(nèi)容
import re
text = "Hello, my email is test@example.com. Please contact me!"
# 正則表達(dá)式
pattern = r'\S+@\S+'
# 替換郵箱為“[郵箱隱藏]”
new_text = re.sub(pattern, "[郵箱隱藏]", text)
print(new_text)
運(yùn)行結(jié)果
Hello, my email is [郵箱隱藏]. Please contact me!
正則表達(dá)式是處理字符串和文本數(shù)據(jù)的強(qiáng)大工具,能夠高效地進(jìn)行匹配、查找和替換等操作。掌握其基本語法和用法,可以幫助您在編程和數(shù)據(jù)處理時更為輕松。本文通過多個示例展示了正則表達(dá)式在Python中的使用,希望對您有所幫助。
3.正則表達(dá)式函數(shù)
python的re模塊還比較簡單,包括以下幾個方法:
- re.search():查找符合模式的字符,只返回第一個,返回Match對象
- re.match():和search一樣,但要求必須從字符串開頭匹配
- re.findall():返回所有匹配的字符串列表
- re.finditer():返回一個迭代器,其中包含所有的匹配,也就是Match對象
- re.sub():替換匹配的字符串,返回替換完成的文本
- re.subn():替換匹配的字符串,返回替換完成的文本和替換的次數(shù)
- re.split():用匹配表達(dá)式的字符串做分隔符分割原字符串
- re.compile():把正則表達(dá)式編譯成一個對象,方便后面使用
1.?re.search(pattern, string, flags=0)
- 作用:在字符串中搜索匹配的模式,找到第一個匹配后返回一個
Match
對象,如果沒有找到匹配,則返回None
。 - 示例
import re
result = re.search(r'\d+', 'hello 123 world')
print(result.group()) ?# 輸出: 123
2.?re.match(pattern, string, flags=0)
- 作用:與
search()
類似,但是它只匹配字符串的開始。如果字符串的開始不符合模式,則返回None
。 - 示例
result = re.match(r'\d+', '123 hello world')
print(result.group()) ?# 輸出: 123
3.?re.findall(pattern, string, flags=0)
- 作用:返回字符串中所有與模式匹配的非重疊匹配項的列表。
- 示例
results = re.findall(r'\d+', 'hello 123 world 456')
print(results) ?# 輸出: ['123', '456']
4.?re.finditer(pattern, string, flags=0)
- 作用:返回一個迭代器,產(chǎn)生所有匹配的
Match
對象。 - 示例
for match in re.finditer(r'\d+', 'hello 123 world 456'):
? ? print(match.group()) ?# 分別輸出: 123 和 456
5.?re.sub(pattern, repl, string, count=0, flags=0)
- 作用:用
repl
替換string
中所有匹配pattern
的部分,返回替換后的字符串。count
參數(shù)可以指定最大替換次數(shù)。 - 示例
new_string = re.sub(r'\d+', 'number', 'hello 123 world 456')
print(new_string) ?# 輸出: hello number world number
6.?re.subn(pattern, repl, string, count=0, flags=0)
- 作用:與
sub()
相同,但是返回一個元組,包含替換后的字符串和替換的次數(shù)。 - 示例
new_string, n = re.subn(r'\d+', 'number', 'hello 123 world 456')
print(new_string) ?# 輸出: hello number world number
print(n) ?# 輸出: 2
7.?re.split(pattern, string, maxsplit=0, flags=0)
- 作用:根據(jù)模式對字符串進(jìn)行分割,返回一個列表。
maxsplit
參數(shù)可以指定最大分割次數(shù)。 - 示例
parts = re.split(r'\s+', 'hello ? world')
print(parts) ?# 輸出: ['hello', 'world']
8.?re.compile(pattern, flags=0)
- 作用:編譯正則表達(dá)式模式為正則表達(dá)式對象,這樣可以在后續(xù)的操作中復(fù)用這個對象,提高效率。
- 示例
pattern = re.compile(r'\d+')
result = pattern.search('hello 123 world')
print(result.group()) ?# 輸出: 123
以上就是關(guān)于re
模塊中一些常用方法的簡介和示例,希望對您有所幫助。如果您有任何具體的問題或需要進(jìn)一步的幫助,請隨時提問!
4.一些經(jīng)驗之談
[]
(字符集)和{}
(量詞)前后順序區(qū)別
a.本質(zhì)區(qū)別
[]
(字符集):定義 "允許出現(xiàn)的單個字符范圍",只能匹配一個字符。例如:[abc]
?表示匹配 "a"、"b" 或 "c" 中的任意一個字符;[0-9]
?表示匹配任意一個數(shù)字。{}
(量詞):定義 "前面元素的出現(xiàn)次數(shù)",不能單獨(dú)使用,必須跟在某個元素(字符、字符集、分組等)后面。例如:a{2}
?表示 "a" 連續(xù)出現(xiàn) 2 次;[0-9]{3}
?表示任意數(shù)字連續(xù)出現(xiàn) 3 次。
b. 前后順序規(guī)則--->[字符集]{次數(shù)}
[]
?通常在?{}
?前面,因為量詞({}
)是用來修飾它前面的元素(可以是?[]
?定義的字符集)的。即:[字符集]{次數(shù)}
?→ 表示 "字符集中的字符允許出現(xiàn)的次數(shù)"。
示例:
[0-9]{3}
:[0-9]
?定義了 "單個數(shù)字",{3}
?修飾這個字符集,表示 "連續(xù) 3 個數(shù)字"(如 "123")。[a-zA-Z]{2,5}
:[a-zA-Z]
?定義了 "單個字母",{2,5}
?表示 "2 到 5 個連續(xù)字母"(如 "abc"、"xyz12" 不匹配,因為包含數(shù)字)。
c. 反例(錯誤順序)--->反過來則是拼接
- 正常邏輯:
[]
(定義單個字符范圍)在前,{}
(定義該范圍的出現(xiàn)次數(shù))在后 →?[字符集]{次數(shù)}
。 - 核心關(guān)系:
{}
?是 "修飾符",[]
?是 "被修飾的元素",修飾符必須跟在被修飾元素后面。 - 特殊情況:
[]
?內(nèi)部的?{}
?僅作為普通符號處理,不表示量詞。
該文章在 2025/9/8 11:50:30 編輯過