前言html
近期小編在進行評測語料的製做時,涉及到一些複雜字符串的過濾和提取等內容,例如找出某一句話中在某個特定語句結構下出現的文字,雖然使用循環,if-else等語句能夠搞定,可是比較麻煩,使用正則表達式處理就比較方便。python
正則表達式定義正則表達式
正則表達式,又稱正規表達式(英文:Regular Expression,RE),它使用單個字符串來描述,匹配一系列符合某個句法規則的字符串,在不少的文本編輯器裏,正則表達式一般被用來檢索和替換那些匹配某個模式的文本。微信
正則表達式使用併發
舉個栗子,假設使用爬蟲得到一個HTML源碼,其中一段爲:app
str1=r"<html><body><h1>hello.world<h1></body></html><h1>hello:world<h1><h1>helloAworld<h1>"
這時候若是想提取全部的hello(x)world,一般須要對字符串進行split操做等,可是當第二個<h1>變爲</h1>, 問題就會變得複雜起來。而用以下正則表達式則能夠直接將hello(x)word提取出來:編輯器
import rep1 = r"hello.world"pattern =re.compile(p1)print(re.findall(pattern, str1))
其中,p1爲正則表達式字符串,hello與world之間的「.」爲一個能夠匹配任何字符的元字符(後面有介紹),pattern爲通過編譯後獲得的正則表達式對象,這樣作的目的是便於後面的匹配中能夠複用,上述表達式獲得結果爲:分佈式
正則表達式匹配方法
除了上面介紹的findall方法以外,正則表達式經常使用的匹配方法還有 match和search,三者之間的區別爲:
match:從字符串的起始位置匹配正則表達式,若是匹配,就返回匹配成功的結果;若是不匹配,就返回None;
search: 它在匹配時會掃描整個字符串,而後返回第一個成功匹配的結果,若是搜索完了還沒找到,則返回None;
findall: 該方法會搜索整個字符串,而後返回一個list,匹配正則表達式的全部內容。
正則表達式範圍匹配
在一段字符串內,咱們能夠在一段範圍內選擇要或者不要某些字符,例若有以下字符串:
str2 = r"lap &ap nap rap xap xap pap"
對於str2,咱們想要除了&ap以外的全部正常的字符串,經過以下表達式便可完成:
p2 = r"[lnrxp]ap" #字母開頭ap都要pattern = re.compile(p)print (re.findall(pattern,str2))
上述代碼獲得的結果爲:
上述正則表達式中,對於str2中存在類別較少的(x)ap,當有26個字母而且區分大小寫時使用該語句顯然不現實,Python內置了不少簡潔的正則表達式,避免咱們在提取的過程當中須要把想要的字母一個個寫出來,常見的有:
[0-9]0123456789任意之一
[a-z]小寫字母任意之一
[A-Z]大寫字母任意之一
\d 等同於[0-9]
\D 等同於[^0-9]即匹配非數字
\w 等同於[a-z0-9A-Z]匹配大小寫字母,數字和下劃線
\W 等同於上一條取非
所以對於上述正則表達式p2,使用r"\wap",r「[a-z]ap」獲得的結果是同樣的。此外咱們在前面已經介紹過「.」元字符,在p2中,「[]」也是一個元字符,它表示的是當前表達式匹配[]內任意的字符。Python中還內置了不少元字符,方便了咱們在寫正則表達式時可以更簡潔的表述。讀者能夠訪問一下網址來查看定義:https://www.runoob.com/regexp/regexp-metachar.html。
正則表達之貪心與懶惰
假設有以下字符串:
str3 = r"sogoutest@sogou-inc.com.cn"
咱們想要把str3中從@開始一直到「.」以前的內容匹配出來,則能夠這樣去實現
p3 = r"@.+\."pattern= re.compile(p3)print (re.findall(pattern,str3))
其中,「+」也是也是一個元字符,表示匹配前面的最近的字符一次或屢次,能夠看到,此時表達式儘量多地進行匹配,匹配到了com後面的「.」,即貪心模式。若只想匹配到第一個點結束,便可使用以下語句改成懶惰模式。
p3 = r"@.+?\."pattern= re.compile(p3)print (re.findall(pattern,str3))
此時咱們能夠看到,結果在匹配到inc後面的「.」就結束了。
參考連接:
1.https://www.py.cn/spider/guide/14488.html
2.https://www.py.cn/faq/python/12021.html
3.https://www.runoob.com/regexp/regexp-metachar.html
結語
2020/03/17
正則表達式在處理字符串時做用很大,結合Python提供的元字符列表能夠實現功能更多更復雜的語句,針對同一個問題的解決方式可能會有不少種,須要在平時使用中加以運用熟練掌握。
正則表達式往期推文:
一塊兒來了解一下正則表達式
文章合集
Selenium | Appium | Jenkins | Jmeter
軟件測試方法彙總 | Postman接口參數化 | 測試用例設計
視頻教程
Selenium | Appium | Jenkins | Jmeter
往期性能推文:
03|性能綜述: 怎麼理解TPS、QPS、RT、吞吐量這些性能指標?
04|JMeter和LoadRunner:要知道工具僅僅只是工具
05|指標關係:你知道併發用戶數應該怎麼算嗎?
性能測試工具--Locust官方文檔(API)解讀(全)
AWS與Docker
如何使用AWS EC2+Docker+JMeter構建分佈式負載測試基礎架構
Docker容器數據持久化和容器網橋鏈接
Docker刪除image和container
Docker與VM虛擬機的區別以及Docker的特色
END
以爲不錯,能夠點「在看」,或者轉發、留言
精彩的內容要和朋友分享哦
本文分享自微信公衆號 - 軟測小生(ruancexiaosheng)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。