新聞中心
正則表達(dá)式可用于搜索、編輯和操作文本。Python RegEx 被幾乎所有的公司廣泛使用,并且對(duì)他們的應(yīng)用程序具有良好的行業(yè)吸引力,從而使得正則表達(dá)式越來(lái)越受重視。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),樺甸企業(yè)網(wǎng)站建設(shè),樺甸品牌網(wǎng)站建設(shè),網(wǎng)站定制,樺甸網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,樺甸網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
今天我們就一起來(lái)學(xué)習(xí)下 Python 正則表達(dá)式。
為什么要使用正則表達(dá)式。
為了回答這個(gè)問(wèn)題,我們先來(lái)看看我們面臨的各種問(wèn)題,而這些問(wèn)題又可以通過(guò)使用正則表達(dá)式來(lái)解決。
考慮以下場(chǎng)景:
文末有一個(gè)包含大量數(shù)據(jù)的日志文件,從這個(gè)日志文件中,希望只獲取日期和時(shí)間。乍一看,日志文件的可讀性是很低的。
在這種情況下,可以使用正則表達(dá)式來(lái)識(shí)別模式并輕松提取所需信息。
考慮下一個(gè)場(chǎng)景:你是一名銷(xiāo)售人員,有很多電子郵件地址,其中很多地址都是假的/無(wú)效的,看看下面的圖片:
我們可以做的是使用正則表達(dá)式,可以驗(yàn)證電子郵件地址的格式并從真實(shí) ID 中過(guò)濾掉虛假 ID。
下一個(gè)場(chǎng)景與銷(xiāo)售員示例的場(chǎng)景非常相似,考慮下圖:
我們?nèi)绾悟?yàn)證電話號(hào)碼,然后根據(jù)原產(chǎn)國(guó)對(duì)其進(jìn)行分類(lèi)?
每個(gè)正確的數(shù)字都會(huì)有一個(gè)特定的模式,可以通過(guò)使用正則表達(dá)式來(lái)跟蹤和跟蹤。
接下來(lái)是另一個(gè)簡(jiǎn)單的場(chǎng)景:
我們有一個(gè)學(xué)生數(shù)據(jù)庫(kù),其中包含姓名、年齡和地址等詳細(xì)信息??紤]一下地區(qū)代碼最初是 59006 但現(xiàn)在已更改為 59076 的情況,這種情況為每個(gè)學(xué)生手動(dòng)更新此代碼將非常耗時(shí)且過(guò)程非常漫長(zhǎng)。
基本上,為了使用正則表達(dá)式解決這些問(wèn)題,我們首先從包含 pin 碼的學(xué)生數(shù)據(jù)中找到一個(gè)特定的字符串,然后將它們?nèi)刻鎿Q為新字符串。
什么是正則表達(dá)式
正則表達(dá)式用于識(shí)別文本字符串中的搜索模式,它還有助于找出數(shù)據(jù)的正確性,甚至可以使用正則表達(dá)式進(jìn)行查找、替換和格式化數(shù)據(jù)等操作。
考慮以下示例:
在給定字符串的所有數(shù)據(jù)中,假設(shè)我們只需要城市,這可以以格式化的方式轉(zhuǎn)換為僅包含名稱(chēng)和城市的字典?,F(xiàn)在的問(wèn)題是,我們能否確定一種模式來(lái)猜測(cè)名稱(chēng)和城市?此外我們也可以找出年齡,隨著年齡的增長(zhǎng),這很容易,對(duì)吧?它只是一個(gè)整數(shù)。
我們?nèi)绾翁幚磉@個(gè)名字?如果你看一下這個(gè)模式,所有的名字都以大寫(xiě)字母開(kāi)頭。借助正則表達(dá)式,我們可以使用此方法識(shí)別姓名和年齡。
我們可以使用下面的代碼
import re
Nameage = '''
Janice is 22 and Theon is 33
Gabriel is 44 and Joey is 21
'''
ages = re.findall(r'd{1,3}', Nameage)
names = re.findall(r'[A-Z][a-z]*',Nameage)
ageDict = {}
x = 0
for eachname in names
ageDict[eachname] = ages[x]
x+=1
print(ageDict)
Output:
{'Janice': '22', 'Theon': '33', 'Gabriel': '44', 'Joey': '21'}
正則表達(dá)式幾個(gè)示例:
可以使用正則表達(dá)式執(zhí)行許多操作。在這里,我列出了一些幫助更好地理解正則表達(dá)式的用法非常重要的內(nèi)容。
讓我們首先檢查如何在字符串中找到特定單詞
在字符串中查找一個(gè)單詞
import re
if re.search("inform","we need to inform him with the latest information"):
print("There is inform")
我們?cè)谶@里所做的一切都是為了搜索單詞 inform 是否存在于我們的搜索字符串中。
當(dāng)然我們還可以?xún)?yōu)化以下代碼
import re
allinform = re.findall("inform","We need to inform him with the latest information!")
for i in allinform:
print(i)
在這里,在這種特殊情況下,將找到兩次infor。一個(gè)來(lái)自inform,另一個(gè)來(lái)自information。
如上所示,在正則表達(dá)式中查找單詞就這么簡(jiǎn)單。
接下來(lái)我們將了解如何使用正則表達(dá)式生成迭代器。
生成迭代器
生成迭代器是找出并目標(biāo)字符串的開(kāi)始和結(jié)束索引的簡(jiǎn)單過(guò)程??紤]以下示例:
import re
Str = "we need to inform him with the latest information"
for i in re.finditer("inform.", Str
locTuple = i.span()
print(locTuple)
對(duì)于找到的每個(gè)匹配項(xiàng),都會(huì)打印開(kāi)始和結(jié)束索引。當(dāng)我們執(zhí)行上述程序時(shí),輸出如下:
(11, 18)
(38, 45)
接下來(lái)我們將檢查如何使用正則表達(dá)式將單詞與模式匹配。
將單詞與模式匹配
考慮一個(gè)輸入字符串,我們必須將某些單詞與該字符串匹配。要詳細(xì)說(shuō)明,請(qǐng)查看以下示例代碼:
import re
Str = "Sat, hat, mat, pat"
allStr = re.findall("[shmp]at", Str)
for i in allStr:
print(i)
字符串中有什么共同點(diǎn)?可以看到字母“a”和“t”在所有輸入字符串中都很常見(jiàn)。代碼中的 [shmp] 表示要查找的單詞的首字母,因此,任何以字母 s、h、m 或 p 開(kāi)頭的子字符串都將被視為匹配,其中任何一個(gè),并且最后必須跟在“at”后面。
Output:
hat
mat
pat
接下來(lái)我們將檢查如何使用正則表達(dá)式一次匹配一系列字符。
匹配一系列字符范圍
我們希望輸出第一個(gè)字母應(yīng)該在 h 和 m 之間并且必須緊跟 at 的所有單詞??纯聪旅娴睦?,我們應(yīng)該得到的輸出是 hat 和 mat
import re
Str = "sat, hat, mat, pat"
someStr = re.findall("[h-m]at", Str)
for i in someStr:
print(i)
Output:
hat
mat
現(xiàn)在讓我們稍微改變一下上面的程序以獲得一個(gè)不同的結(jié)果
import re
Str = "sat, hat, mat, pat"
someStr = re.findall("[^h-m]at", Str)
for i in someStr:
print(i)
發(fā)現(xiàn)細(xì)微差別了嗎,我們?cè)谡齽t表達(dá)式中添加了插入符號(hào) (^),它的作用否定了它所遵循的任何效果。我們不會(huì)給出從 h 到 m 開(kāi)始的所有內(nèi)容的輸出,而是會(huì)向我們展示除此之外的所有內(nèi)容的輸出。
我們可以預(yù)期的輸出是不以 h 和 m 之間的字母開(kāi)頭但最后仍然緊隨其后的單詞。Output:
sat
pat
替換字符串:
接下來(lái),我們可以使用正則表達(dá)式檢查另一個(gè)操作,其中我們將字符串中的一項(xiàng)替換為其他內(nèi)容:
import re
Food = "hat rat mat pat"
regex = re.compile("[r]at")
Food = regex.sub("food", Food)
print(Food)
在上面的示例中,單詞 rat 被替換為單詞 food。正則表達(dá)式的替代方法就是利用這種情況,它也有各種各樣的實(shí)際用例。Output:
hat food mat pat
反斜杠問(wèn)題
import re
randstr = "Here is Edureka"
print(randstr)
Output:
Here is Edureka
這就是反斜杠問(wèn)題,其中一個(gè)斜線從輸出中消失了,這個(gè)特殊問(wèn)題可以使用正則表達(dá)式來(lái)解決。
import re
randstr = "Here is Edureka"
print(re.search(r"Edureka", randstr))
Output:
這就是使用正則表達(dá)式解決反斜杠問(wèn)題的簡(jiǎn)單方法。
匹配單個(gè)字符
使用正則表達(dá)式可以輕松地單獨(dú)匹配字符串中的單個(gè)字符
import re
randstr = "12345"
print("Matches: ", len(re.findall("d{5}", randstr)))
Output:
Matches: 1
刪除換行符
我們可以在 Python 中使用正則表達(dá)式輕松刪除換行符
import re
randstr = '''
You Never
Walk Alone
Liverpool FC
'''
print(randstr)
regex = re.compile("
")
randstr = regex.sub(" ", randstr)
print(randstr)
Output:
You Never
Walk Alone
Liverpool FC
You Never Walk Alone Liverpool FC
可以從上面的輸出中看到,新行已被空格替換,并且輸出打印在一行上。
還可以使用許多其他東西,具體取決于要替換字符串的內(nèi)容
: Backspace
: Formfeed
: Carriage Return
: Tab
: Vertical Tab
可以使用如下代碼
import re
randstr = "12345"
print("Matches:", len(re.findall("d", randstr)))
Output:
Matches: 5
從上面的輸出可以看出,d 匹配字符串中存在的整數(shù)。但是,如果我們用 D 替換它,它將匹配除整數(shù)之外的所有內(nèi)容,與 d 完全相反。
接下來(lái)我們了解一些在 Python 中使用正則表達(dá)式的重要實(shí)際例子。
正則表達(dá)式的實(shí)際例子
我們將檢查使用最為廣泛的 3 個(gè)主要用例
- 電話號(hào)碼驗(yàn)證
- 電子郵件地址驗(yàn)證
- 網(wǎng)頁(yè)抓取
電話號(hào)碼驗(yàn)證
需要在任何相關(guān)場(chǎng)景中輕松驗(yàn)證電話號(hào)碼
考慮以下電話號(hào)碼:
- 444-122-1234
- 123-122-78999
- 111-123-23
- 67-7890-2019
電話號(hào)碼的一般格式如下:
- 以 3 位數(shù)字和“-”符號(hào)開(kāi)頭
- 3 個(gè)中間數(shù)字和“-”號(hào)
- 最后4位數(shù)
我們將在下面的示例中使用 w,請(qǐng)注意 w = [a-zA-Z0-9_]
import re
phn = "412-555-1212"
if re.search("w{3}-w{3}-w{4}", phn):
print("Valid phone number")
Output:
Valid phone number
電子郵件驗(yàn)證
在任何情況下驗(yàn)證電子郵件地址的有效性。
考慮以下電子郵件地址示例:
- [email protected]
- Anirudh@com
- AC.com
- 123 @.com
我們只需一眼就可以從無(wú)效的郵件 ID 中識(shí)別出有效的郵件 ID,但是當(dāng)我們的程序?yàn)槲覀冏鲞@件事時(shí),卻并沒(méi)有那么容易,但是使用正則,就非常簡(jiǎn)單了。
指導(dǎo)思路,所有電子郵件地址應(yīng)包括:
- 1 到 20 個(gè)小寫(xiě)和/或大寫(xiě)字母、數(shù)字以及 . _ % +
- 一個(gè)@符號(hào)
- 2 到 20 個(gè)小寫(xiě)和大寫(xiě)字母、數(shù)字和加號(hào)
- 一個(gè)點(diǎn)號(hào)
- 2 到 3 個(gè)小寫(xiě)和大寫(xiě)字母
import re
email = "[email protected] [email protected] @seo.com [email protected]"
print("Email Matches: ", len(re.findall("[w._%+-]{1,20}@[w.-]{2,20}.[A-Za-z]{2,3}", email)))
Output:
Email Matches: 1
從上面的輸出可以看出,我們輸入的 4 封電子郵件中有一封有效的郵件。
這基本上證明了使用正則表達(dá)式并實(shí)際使用它們是多么簡(jiǎn)單和高效。
網(wǎng)頁(yè)抓取
從網(wǎng)站上刪除所有電話號(hào)碼以滿(mǎn)足需求。
要了解網(wǎng)絡(luò)抓取,請(qǐng)查看下圖:
我們已經(jīng)知道,一個(gè)網(wǎng)站將由多個(gè)網(wǎng)頁(yè)組成,我們需要從這些頁(yè)面中抓取一些信息。
網(wǎng)頁(yè)抓取主要用于從網(wǎng)站中提取信息,可以將提取的信息以 XML、CSV 甚至 MySQL 數(shù)據(jù)庫(kù)的形式保存,這可以通過(guò)使用 Python 正則表達(dá)式輕松實(shí)現(xiàn)。
import urllib.request
from re import findall
url = "http://www.summet.com/dmsi/html/codesamples/addresses.html"
response = urllib.request.urlopen(url)
html = response.read()
htmlStr = html.decode()
pdata = findall("(d{3}) d{3}-d{4}", htmlStr)
for item in pdata:
print(item)
Output:
(257) 563-7401
(372) 587-2335
(786) 713-8616
(793) 151-6230
(492) 709-6392
(654) 393-5734
(404) 960-3807
(314) 244-6306
(947) 278-5929
(684) 579-1879
(389) 737-2852
...
我們首先是通過(guò)導(dǎo)入執(zhí)行網(wǎng)絡(luò)抓取所需的包,最終結(jié)果包括作為使用正則表達(dá)式完成網(wǎng)絡(luò)抓取的結(jié)果而提取的電話號(hào)碼。
新聞名稱(chēng):整理了幾個(gè)Python正則表達(dá)式,拿走就能用!
當(dāng)前網(wǎng)址:http://fisionsoft.com.cn/article/ccocips.html


咨詢(xún)
建站咨詢(xún)
