整理了幾個Python正則表示式,拿走就能用!

語言: CN / TW / HK

正則表示式可用於搜尋、編輯和操作文字。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

電子郵件驗證

在任何情況下驗證電子郵件地址的有效性。

考慮以下電子郵件地址示例:

我們只需一眼就可以從無效的郵件 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
...

我們首先是通過匯入執行網路抓取所需的包,最終結果包括作為使用正則表示式完成網路抓取的結果而提取的電話號碼。