新聞中心
?每當(dāng)你遇到文本處理問題時(shí),正則表達(dá)式(regex)總是你的好朋友。

員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),重慶小程序開發(fā)公司,軟件按需定制網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
?然而,要記住所有復(fù)雜的規(guī)則是很難的甚至是不可能的。甚至僅僅閱讀語法也是令人不知所措的。
因此,學(xué)習(xí)正則表達(dá)式的優(yōu)秀方法是通過學(xué)習(xí)實(shí)際示例。
本文將總結(jié)日常編程場景中常用的九個(gè)正則表達(dá)式技巧。閱讀完后,正則表達(dá)式對你來說就像喝杯茶一樣簡單。
1.驗(yàn)證電子郵件地址
檢查電子郵件地址的有效性是正則表達(dá)式的經(jīng)典用例。
下面是一個(gè)示例程序:
import re
def val_email(email):
pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$"
if re.match(pattern, email):
print("合法的郵件地址:)")
else:
print("無效的郵件地址!!")
val_email(email="[email protected]")
# 合法的郵件地址:)
val_email(email="elonexample.com")
# 無效的郵件地址!!
val_email(email="[email protected]")
# 無效的郵件地址!!
在這個(gè)例子中,我們使用 Python 中的 re 模塊來編譯一個(gè)匹配有效電子郵件格式的正則表達(dá)式模式。然后,我們使用它的 match() 函數(shù)來檢查 email 變量是否與模式匹配。
在模式中,有幾個(gè)關(guān)鍵點(diǎn):
- 我們使用 [] 表示一個(gè)范圍。例如,[a-zA-Z0-9] 可以匹配 0 到 9 之間的數(shù)字、A 到 Z 之間的字母或 a 到 z 之間的字母。
- ^ 表示行的開頭。在我們的例子中,我們使用它來確保文本必須以 [a-zA-Z0-9] 開始。
- $ 表示行的結(jié)尾。
- \ 用于轉(zhuǎn)義特殊字符(允許我們匹配像 ‘.’ 這樣的字符)。
- {n,m} 語法是用來匹配 n-m 個(gè)先前的正則表達(dá)式。我們使用了 {2,},這意味著前面的部分 [a-zA-Z] 應(yīng)該至少重復(fù) 2 次。這就是為什么 “[email protected]” 被識別為無效的電子郵件地址。
- ■表示匹配前面的正則表達(dá)式至少 1 次。例如,ab+ 將匹配 a 后面的任何非零數(shù)量的 b。
這個(gè)經(jīng)典的例子演示了在 Python 中使用正則表達(dá)式的一些基本語法。
實(shí)際上,Python 的 re 模塊是一個(gè)隱藏的寶藏,我們可以從中使用許多更多的技巧。
2.從字符串中提取數(shù)字
要從長文本中找到一些特殊字符,最直接的想法是使用 for 循環(huán)遍歷所有字符并找到所需的內(nèi)容。
但是,沒有必要使用任何循環(huán)。正則表達(dá)式就是為了作為過濾器而生的。
import re
def extract_numbers(text):
pattern = r"\d+"
return re.findall(pattern, text)
print(extract_numbers("Linux迷的文章閱讀量超過100000000。"))
# ['100000000']
如上所示,re.findall() 函數(shù)接收一個(gè)正則表達(dá)式和一個(gè)文本,可以方便地幫助我們找到所有我們需要的字符。
其中 \d 用于在正則表達(dá)式中匹配數(shù)字。
接下來我們看一個(gè)具體例子,演示 \d 的用途。
3.驗(yàn)證電話號碼
下面的例子利用了 \d 的用法來驗(yàn)證有效的電話號碼:
import re
def is_valid_phone_number(phone_number):
pattern = r"^\d{3}-\d{3}-\d{4}$"
return bool(re.match(pattern, phone_number))
print(is_valid_phone_number("123-456-7890")) # True
print(is_valid_phone_number("1234567890")) # False
除了 \d 外,我們還使用了 ^、$ 和 {n} 語法來確保字符串是一個(gè)有效的電話號碼。
4.將文本分割成單詞
將長文本分割成單獨(dú)的單詞是日常編程中的另一個(gè)常見需求。借助 re 模塊的 split() 函數(shù),我們可以輕松完成此任務(wù):
>>> re.split(r'\s+', 'a b c')
# ['a', 'b', 'c']
>>> re.split(r'[\s\,]+', 'a,b, c d')
# ['a', 'b', 'c', 'd']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
如上述代碼所示,我們使用 \s 來在正則表達(dá)式中匹配一個(gè)空格。
5.使用正則表達(dá)式查找和替換文本
在使用正則表達(dá)式從文本中找到特定字符后,我們可能需要用新的字符串來替換它們。
re 模塊的 sub() 函數(shù)可以使這個(gè)過程變得非常順暢:
import re
text = "linuxmi is an full-stack software engineer."
pattern = r"[a-e]"
replacement = "*"
new_text = re.sub(pattern, replacement, text)
print(new_text)
#linuxmi is *n full-st**k softw*r* *ngin**r.
如上所示,我們只需要將三個(gè)參數(shù)傳遞給sub()函數(shù):模式、替換字符串和原始文本。它將在執(zhí)行后返回新文本。
6.在Python中預(yù)編譯正則表達(dá)式
在Python中使用正則表達(dá)式匹配字符串時(shí),有兩個(gè)步驟:
編譯正則表達(dá)式。 使用編譯后的正則表達(dá)式匹配字符串。 因此,如果一個(gè)正則表達(dá)式被重復(fù)使用,每次編譯都會浪費(fèi)時(shí)間。
為了避免這種情況,Python允許我們預(yù)先編譯一個(gè)正則表達(dá)式,然后重復(fù)使用編譯后的對象進(jìn)行后續(xù)匹配。這可以顯著提高性能和效率。
import re
re_numbers = re.compile(r'^\d+$')
print(re_numbers.match('123'))
#
print(re_numbers.match('linuxmi'))
# None
上面的例子展示了如何使用re模塊中的compile()函數(shù)預(yù)編譯正則表達(dá)式并稍后使用它。只要字符串無法匹配正則表達(dá)式,match()函數(shù)就會返回None。
7.提取和操作文本的子內(nèi)容
group()方法是Python re模塊中的一個(gè)函數(shù),它返回一個(gè)或多個(gè)匹配的正則表達(dá)式匹配對象的子組。它非常方便,用于提取文本的不同部分。
例如,以下代碼展示了如何從“HH:MM”格式的時(shí)間字符串中提取兩個(gè)部分:
import re
time='21:37'
matched = re.match(r'^(0[0-9]|1[0-9]|2[0-3])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])$', time)
print(matched.groups())
# ('21', '37')
print(matched.group())
# '21:37'
print(matched.group(0))
# '21:37'
print(matched.group(1))
# '21'
print(matched.group(2))
# '37'
如上所示,group(0) 返回原始字符串。然后,group(1) 和 group(2) 分別返回匹配字符串的第一部分和第二部分。
8.用于提取子內(nèi)容的命名分組
如果子組數(shù)量變得很多,由于太多的神奇數(shù)字,程序?qū)⒑茈y閱讀。
因此,Python 提供了用于子內(nèi)容提取的命名組技巧:我們可以使用命名組捕獲匹配字符串的特定部分,而不是使用編號的捕獲組。這可以使我們的代碼更易于閱讀和維護(hù)。
以下是一個(gè)例子:
import re
text = "linuxmi, age 27"
pattern = r"(?P\w+),\sage\s(?P \d+)"
match = re.search(pattern, text)
print(match.group("name"))
# linuxmi
print(match.group("age"))
# 27
如上所示,命名分組的關(guān)鍵語法是 ?P
9.使用VERBOSE標(biāo)志使正則表達(dá)式易讀
在一些復(fù)雜的情況下,正則表達(dá)式可能會變得越來越復(fù)雜和難以讀取。我們肯定需要一種方法來使其更整潔和干凈。
這就是re.VERBOSE技巧。
import re
text = "linuxmi, [email protected], 666-666-6666"
pattern = r"""
(?P\w+),\s
(?P\w+@\w+\.\w+),\s
(?P\d{3}-\d{3}-\d{4})
"""
match = re.search(pattern, text, re.VERBOSE)
if match:
print(match.group("name"))
print(match.group("email"))
print(match.group("phone"))
# linuxmi
# [email protected]
# 666-666-6666
如上所示,我們可以將復(fù)雜的正則表達(dá)式分成多行,以提高可讀性。只要在re.search()函數(shù)中加入re.VERBOSE標(biāo)志,它就可以像平常一樣被正確識別。
本文標(biāo)題:在Python中使用正則表達(dá)式的九個(gè)實(shí)例
網(wǎng)站URL:http://fisionsoft.com.cn/article/ccohjso.html


咨詢
建站咨詢
