整理了幾個Python正則表達式,拿走就能用!
正則表達式可用於搜索、編輯和操作文本。Python RegEx 被幾乎所有的公司廣泛使用,並且對他們的應用程序具有良好的行業吸引力,從而使得正則表達式越來越受重視。
今天我們就一起來學習下 Python 正則表達式。
為什麼要使用正則表達式。
為了回答這個問題,我們先來看看我們面臨的各種問題,而這些問題又可以通過使用正則表達式來解決。
考慮以下場景:
文末有一個包含大量數據的日誌文件,從這個日誌文件中,希望只獲取日期和時間。乍一看,日誌文件的可讀性是很低的。
在這種情況下,可以使用正則表達式來識別模式並輕鬆提取所需信息。
考慮下一個場景:你是一名銷售人員,有很多電子郵件地址,其中很多地址都是假的/無效的,看看下面的圖片:
我們可以做的是使用正則表達式,可以驗證電子郵件地址的格式並從真實 ID 中過濾掉虛假 ID。
下一個場景與銷售員示例的場景非常相似,考慮下圖:
我們如何驗證電話號碼,然後根據原產國對其進行分類?
每個正確的數字都會有一個特定的模式,可以通過使用正則表達式來跟蹤和跟蹤。
接下來是另一個簡單的場景:
我們有一個學生數據庫,其中包含姓名、年齡和地址等詳細信息。考慮一下地區代碼最初是 59006 但現在已更改為 59076 的情況,這種情況為每個學生手動更新此代碼將非常耗時且過程非常漫長。
基本上,為了使用正則表達式解決這些問題,我們首先從包含 pin 碼的學生數據中找到一個特定的字符串,然後將它們全部替換為新字符串。
什麼是正則表達式
正則表達式用於識別文本字符串中的搜索模式,它還有助於找出數據的正確性,甚至可以使用正則表達式進行查找、替換和格式化數據等操作。
考慮以下示例:
在給定字符串的所有數據中,假設我們只需要城市,這可以以格式化的方式轉換為僅包含名稱和城市的字典。現在的問題是,我們能否確定一種模式來猜測名稱和城市?此外我們也可以找出年齡,隨着年齡的增長,這很容易,對吧?它只是一個整數。
我們如何處理這個名字?如果你看一下這個模式,所有的名字都以大寫字母開頭。藉助正則表達式,我們可以使用此方法識別姓名和年齡。
我們可以使用下面的代碼
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'}
正則表達式幾個示例:
可以使用正則表達式執行許多操作。在這裏,我列出了一些幫助更好地理解正則表達式的用法非常重要的內容。
讓我們首先檢查如何在字符串中找到特定單詞
在字符串中查找一個單詞
import re if re.search("inform","we need to inform him with the latest information"): print("There is inform")
我們在這裏所做的一切都是為了搜索單詞 inform 是否存在於我們的搜索字符串中。
當然我們還可以優化以下代碼
import re allinform = re.findall("inform","We need to inform him with the latest information!") for i in allinform: print(i)
在這裏,在這種特殊情況下,將找到兩次infor。一個來自inform,另一個來自information。
如上所示,在正則表達式中查找單詞就這麼簡單。
接下來我們將瞭解如何使用正則表達式生成迭代器。
生成迭代器
生成迭代器是找出並目標字符串的開始和結束索引的簡單過程。考慮以下示例:
import re Str = "we need to inform him with the latest information" for i in re.finditer("inform.", Str locTuple = i.span() print(locTuple)
對於找到的每個匹配項,都會打印開始和結束索引。當我們執行上述程序時,輸出如下:
(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
接下來我們將檢查如何使用正則表達式一次匹配一系列字符。
匹配一系列字符範圍
我們希望輸出第一個字母應該在 h 和 m 之間並且必須緊跟 at 的所有單詞。看看下面的例子,我們應該得到的輸出是 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
現在讓我們稍微改變一下上面的程序以獲得一個不同的結果
import re Str = "sat, hat, mat, pat" someStr = re.findall("[^h-m]at", Str) for i in someStr: print(i)
發現細微差別了嗎,我們在正則表達式中添加了插入符號 (^),它的作用否定了它所遵循的任何效果。我們不會給出從 h 到 m 開始的所有內容的輸出,而是會向我們展示除此之外的所有內容的輸出。
我們可以預期的輸出是不以 h 和 m 之間的字母開頭但最後仍然緊隨其後的單詞。Output:
sat pat
替換字符串:
接下來,我們可以使用正則表達式檢查另一個操作,其中我們將字符串中的一項替換為其他內容:
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:
<re.Match object; span=(8, 16), match='Edureka'>
這就是使用正則表達式解決反斜槓問題的簡單方法。
匹配單個字符
使用正則表達式可以輕鬆地單獨匹配字符串中的單個字符
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
可以從上面的輸出中看到,新行已被空格替換,並且輸出打印在一行上。
還可以使用許多其他東西,具體取決於要替換字符串的內容
: Backspace : Formfeed : Carriage Return : Tab : Vertical Tab
可以使用如下代碼
import re randstr = "12345" print("Matches:", len(re.findall("d", randstr)))
Output:
Matches: 5
從上面的輸出可以看出,d 匹配字符串中存在的整數。但是,如果我們用 D 替換它,它將匹配除整數之外的所有內容,與 d 完全相反。
接下來我們瞭解一些在 Python 中使用正則表達式的重要實際例子。
正則表達式的實際例子
我們將檢查使用最為廣泛的 3 個主要用例
- 電話號碼驗證
- 電子郵件地址驗證
- 網頁抓取
電話號碼驗證
需要在任何相關場景中輕鬆驗證電話號碼
考慮以下電話號碼:
- 444-122-1234
- 123-122-78999
- 111-123-23
- 67-7890-2019
電話號碼的一般格式如下:
- 以 3 位數字和“-”符號開頭
- 3 箇中間數字和“-”號
- 最後4位數
我們將在下面的示例中使用 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
電子郵件驗證
在任何情況下驗證電子郵件地址的有效性。
考慮以下電子郵件地址示例:
- [email protected]
- Anirudh@com
- AC.com
- 123 @.com
我們只需一眼就可以從無效的郵件 ID 中識別出有效的郵件 ID,但是當我們的程序為我們做這件事時,卻並沒有那麼容易,但是使用正則,就非常簡單了。
指導思路,所有電子郵件地址應包括:
- 1 到 20 個小寫和/或大寫字母、數字以及 . _ % +
- 一個@符號
- 2 到 20 個小寫和大寫字母、數字和加號
- 一個點號
- 2 到 3 個小寫和大寫字母
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 封電子郵件中有一封有效的郵件。
這基本上證明了使用正則表達式並實際使用它們是多麼簡單和高效。
網頁抓取
從網站上刪除所有電話號碼以滿足需求。
要了解網絡抓取,請查看下圖:
我們已經知道,一個網站將由多個網頁組成,我們需要從這些頁面中抓取一些信息。
網頁抓取主要用於從網站中提取信息,可以將提取的信息以 XML、CSV 甚至 MySQL 數據庫的形式保存,這可以通過使用 Python 正則表達式輕鬆實現。
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 ...
我們首先是通過導入執行網絡抓取所需的包,最終結果包括作為使用正則表達式完成網絡抓取的結果而提取的電話號碼。
- Spring中實現異步調用的方式有哪些?
- 帶參數的全類型 Python 裝飾器
- 整理了幾個Python正則表達式,拿走就能用!
- SOLID:開閉原則Go代碼實戰
- React中如何引入CSS呢
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫編程語言-遞歸函數是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多線程永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- LeCun再炮轟Marcus: 他是心理學家,不是搞AI的
- Java保證線程安全的方式有哪些?
- 19個殺手級 JavaScript 單行代碼,讓你看起來像專業人士
- Python 的"self"參數是什麼?
- 別整一坨 CSS 代碼了,試試這幾個實用函數
- 再有人問你什麼是MVCC,就把這篇文章發給他!