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

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


咨詢
建站咨詢
