Python 正則表示式元字元


正則表示式,通常稱為 regex,是 Python 中用於模式匹配和文字操作的強大工具。它們允許您定義模式並在字串中搜索匹配項,這使得它們在各種應用程式(如資料驗證、文字處理和網路爬蟲)中非常有用。

在正則表示式中,元字元起著至關重要的作用。這些特殊字元具有預定義的含義,用於構建複雜的模式。有效地理解和利用元字元可以顯著增強您的正則表示式技能。

在本文中,我們將探索 Python 正則表示式元字元的世界。我們將學習不同的元字元以及如何使用它們來構建強大的正則表示式模式。

Python 正則表示式元字元的型別

Python 正則表示式中的元字元是具有預定義含義的特殊字元。它們允許您建立複雜的模式以匹配字串中特定字元序列。在本節中,我們將探討不同型別的元字元及其在 Python 正則表示式中的用法。

錨點

錨點是允許您指定模式在字串中位置的元字元。它們本身不匹配任何字元,但定義匹配應該發生的位置。以下是常用的錨點元字元:

  • • ^ (脫字元)  匹配字串的開頭。它確保跟隨脫字元的模式僅在字串開頭找到。例如,正則表示式 ^Hello 僅當 "Hello" 出現在字串開頭時才會匹配。

示例

import re

string = "Hello, World!"
pattern = "^Hello"

match = re.search(pattern, string)
if match:
   print("Match found!")
else:
   print("No match found.")

輸出

Match found!
  • $ (美元符號)  匹配字串的結尾。它確保在美元符號之前的模式僅在字串結尾找到。例如,正則表示式 World!$ 僅當 "World!" 出現在字串結尾時才會匹配。

示例

import re

string = "Hello, World!"
pattern = "World!$"

match = re.search(pattern, string)
if match:
    print("Match found!")
else:
    print("No match found.")

輸出

Match found!
  • \b (單詞邊界)  匹配單詞開頭或結尾處的空字串。它用於在較大的字串中查詢整個單詞。例如,正則表示式 \bPython\b 僅當 "Python" 作為整個單詞出現時才會匹配。

示例

import re

string = "I love Python programming language."
pattern = r"\bPython\b"

match = re.search(pattern, string)
if match:
    print("Match found!")
else:
    print("No match found.")

輸出

Match found!

字元類

字元類是匹配指定字元集中的單個字元的元字元。它們包含在方括號 [] 中。以下是一些字元類的示例:

  • [abc]  匹配 a、b 或 c。

  • [0-9]  匹配 0 到 9 之間的任何數字。

  • [a-z]  匹配 a 到 z 之間的任何小寫字母。

讓我們來看幾個例子。

匹配單個字元

在字元類內部,您可以指定要匹配的單個字元。例如,模式 [aeiou] 將匹配任何單個小寫母音。

示例

import re

string = "Hello, World!"
pattern = "[aeiou]"

matches = re.findall(pattern, string)
print(matches)

輸出

['e', 'o', 'o']

在此示例中,正則表示式 [aeiou] 匹配字串中所有小寫母音的出現。

字元範圍

字元範圍允許您指定要匹配的字元範圍。無需單獨列出每個字元,您可以使用連字元 - 定義範圍。例如,模式 [a-z] 匹配任何小寫字母。

示例

import re

string = "Hello, World!"
pattern = "[a-z]"

matches = re.findall(pattern, string)
print(matches)

輸出

['e', 'l', 'l', 'o', 'o', 'r', 'l', 'd']

在這種情況下,正則表示式 [a-z] 匹配字串中的所有小寫字母。

否定字元類

您可以透過在字元類開頭使用脫字元 ^ 符號來否定字元類。它將匹配不在指定類中的任何字元。例如,模式 [^aeiou] 匹配任何不是小寫母音的字元。

示例

import re

string = "Hello, World!"
pattern = "[^aeiou]"

matches = re.findall(pattern, string)
print(matches)

輸出

['H', 'l', 'l', ',', ' ', 'W', 'r', 'l', 'd', '!']

在此示例中,正則表示式 [^aeiou] 匹配字串中所有不是小寫母音的字元。

量詞

量詞是指定前一個模式應該出現多少次的元字元。它們控制字元或字元組的重複。以下是一些常用的量詞:

  • *  匹配前一個模式零次或多次。

  • +  匹配前一個模式一次或多次。

  • ?  匹配前一個模式零次或一次。

  • {n}  匹配前一個模式正好 n 次。

  • {n, m}  匹配前一個模式至少 n 次,至多 m 次。

讓我們來了解一些這些方面的實踐示例。

星號 (*) - 零次或多次出現

星號 * 量詞匹配前一個模式零次或多次出現。它透過考慮可能不出現或多次出現的模式來提供靈活性。

示例

import re

string = "Hellooo, Python!"
pattern = "o*"

matches = re.findall(pattern, string)
print(matches)

輸出

['', '', '', '', 'ooo', '', '', '', '', '', '', 'o', '', '', '']

在此示例中,正則表示式 o* 匹配字串中字母 "o" 的所有出現,包括零次出現。

加號 (+) - 一次或多次出現

加號 + 量詞匹配前一個模式一次或多次出現。它確保模式至少出現一次,但允許額外的重複。

示例

import re

string = "Hellooo, Python!"
pattern = "o+"

matches = re.findall(pattern, string)
print(matches)

輸出

['ooo', 'o']

在這種情況下,正則表示式 o+ 匹配字串中字母 "o" 的所有出現,但前提是它出現一次或多次。

問號 (?) - 零次或一次出現

問號 ? 量詞匹配前一個模式零次或一次出現。在處理可選模式時,它允許靈活性。

示例

import re

string = "Hellooo, Python!"
pattern = "lo?"

matches = re.findall(pattern, string)
print(matches)

輸出

['l', 'lo']

這裡,正則表示式 lo? 匹配字串中的 "lo" 和 "l"。 "o" 是可選的,可能存在也可能不存在。

花括號 ({m,n}) - 特定範圍的出現次數

花括號 {m,n} 允許您為前一個模式指定特定範圍的出現次數。出現次數的最小值是 m,最大值是 n。如果省略 n,則表示無限次出現。

示例

import re

string = "Hellooo, Python!"
pattern = "o{2,3}"

matches = re.findall(pattern, string)
print(matches)

輸出

['ooo']

在此示例中,正則表示式 o{2,3} 匹配字母 "o" 的所有連續出現 2 到 3 次的出現。

分組和捕獲

分組元字元允許您在模式中建立子組。它們用圓括號 () 表示。分組有多種用途,例如將量詞應用於組、捕獲匹配文字的一部分或建立稍後使用的反向引用。

示例

以下是一個快速示例:

import re

string = "John Doe, 25 years old"
pattern = r"(\w+) (\w+), (\d+) years old"

matches = re.findall(pattern, string)
print(matches)  # Output: [('John', 'Doe', '25')]

輸出

[('John', 'Doe', '25')]

在此示例中,正則表示式 (\w+) (\w+), (\d+) years old 定義了三個捕獲組。第一個組捕獲名字,第二個組捕獲姓氏,第三個組捕獲年齡。findall() 函式返回一個包含匹配組的元組列表。

示例

您可以使用索引或解包訪問捕獲的組:

for match in matches:
    first_name, last_name, age = match
    print(f"Name: {first_name} {last_name}, Age: {age}")

輸出

Name: John Doe, Age: 25

替換

替換元字元 | 允許您指定備選模式。它匹配左側的模式或右側的模式。當您希望在特定位置匹配多種可能性時,它非常有用。

讓我們看一些例子來了解它是如何工作的。

替換單詞

示例

import re

string = "cat hat mat"
pattern = r"cat|hat|mat"

matches = re.findall(pattern, string)
print(matches)

輸出

['cat', 'hat', 'mat']

在此示例中,正則表示式模式 cat|hat|mat 匹配給定字串中 "cat"、"hat" 或 "mat" 的任何出現。| 符號充當邏輯 OR,允許指定多個備選方案。

替換數字

示例

import re

string = "I have 5 dogs and 3 cats"
pattern = r"\d+ dogs?|\d+ cats?"

matches = re.findall(pattern, string)
print(matches)

輸出

['5 dogs', '3 cats']

在這個示例中,正則表示式模式 \d+ dogs?|\d+ cats? 匹配一個數字後跟“dogs”或一個數字後跟“cats”。? 量詞使前面的“s”可選,允許單數和複數形式。

交替的電子郵件域名

示例

import re

string = "john@example.com, jane@gmail.com, sam@outlook.com"
pattern = r"\w+@(example|gmail|outlook)\.com"

matches = re.findall(pattern, string)
print(matches)  # Output: ['example', 'gmail', 'outlook']

輸出

['example', 'gmail', 'outlook']

在這個示例中,正則表示式模式 \w+@(example|gmail|outlook)\.com 匹配域名分別為“example.com”、“gmail.com”或“outlook.com”的電子郵件地址。括號 () 將備選方案組合在一起,並且需要轉義 . 以匹配字面上的點。

轉義序列

轉義序列允許您將元字元匹配為字面字元。它們由反斜槓 \ 後跟一個元字元表示。例如,要匹配字面上的點 .,您需要將其轉義為 \。

讓我們探索一些常見的轉義序列及其用法。

匹配字面上的點

要匹配字面上的點字元 (.),它在正則表示式中具有特殊含義,您需要使用反斜槓 \ 對其進行轉義。

示例

import re

string = "The price is $5.99."
pattern = r"\$5\.99"

matches = re.findall(pattern, string)
print(matches)  # Output: ['$5.99']

輸出

['$5.99']

在這個示例中,正則表示式模式 \$5\.99 匹配確切的字串“$5.99”。美元符號 $ 和點 . 使用反斜槓進行轉義,以將其視為字面字元。

匹配特殊字元

某些字元在正則表示式中具有特殊含義,例如 *、+、?、{}、()、[]、^、\$、| 和 \。要將這些字元匹配為字面字元,您需要使用反斜槓 \ 對其進行轉義。

示例

import re

string = "The question is: 3 + 4 = ?"
pattern = r"3 \+ 4 = \?"

matches = re.findall(pattern, string)
print(matches)

輸出

['3 + 4 = ?']

在這個示例中,正則表示式模式 3 \+ 4 = \? 匹配確切的字串“3 + 4 = ?”。加號 + 和問號 ? 使用反斜槓進行轉義,以將其視為字面字元。

匹配空格字元

空格字元(如空格、製表符和換行符)也可以使用轉義序列進行匹配。一些常用的空格轉義序列包括 \s 用於任何空格字元,\t 用於製表符,\n 用於換行符。

示例

import re

string = "Hello\tWorld\nPython Regex"
pattern = r"Hello\sWorld\nPython\sRegex"

matches = re.findall(pattern, string)
print(matches)

輸出

['Hello\tWorld\nPython Regex']

在這個示例中,正則表示式模式 Hello\sWorld\nPython\sRegex 匹配確切的字串“Hello\tWorld\nPython Regex”。轉義序列 \s、\t 和 \n 分別用於表示空格、製表符和換行符。

結論

瞭解正則表示式中的轉義序列對於有效匹配特殊字元並將它們視為字面字元至關重要。透過使用反斜槓轉義這些字元,您可以確保它們被逐字解釋,而不是觸發其特殊含義。這使您可以搜尋包含特殊字元的特定模式,而不會無意中修改正則表示式的行為。

在本文中,我們探討了各種轉義序列,例如轉義點字元以匹配字面上的點,轉義 + 和 ? 等特殊字元,以及使用空格字元的轉義序列。這些示例展示了轉義序列在正則表示式中的重要性以及如何利用它們來實現準確的模式匹配。

更新於: 2023年8月10日

654 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.