Python 正則表示式速查表
正則表示式,通常稱為 regex,是 Python 程式設計中用於模式匹配和文字操作的強大工具。它們允許您根據特定模式搜尋、提取和修改文字,使其成為資料驗證、字串操作和文字處理等任務必不可少的工具。
然而,使用正則表示式可能具有挑戰性,尤其對於初學者或不經常使用它們的人來說。記住語法並理解各種元字元和規則可能令人望而生畏。
為了讓您的正則表示式之旅更加順暢,我們建立了一個全面的 Python 正則表示式速查表。此速查表用作方便的參考指南,為您提供 Python 正則表示式中最常用元字元、字元類、量詞、錨點、組、標誌、轉義序列和特殊字元的快速概述。
注意− 請記住在您的 Python 指令碼中匯入 re 模組以使用正則表示式。
常用元字元
元字元是正則表示式中具有特定含義的特殊字元,用於定義模式。理解和使用這些元字元對於有效的模式匹配至關重要。在本節中,我們將探討 Python 正則表示式中一些最常用的元字元。
點 (.) −點元字元匹配除換行符之外的任何字元。它通常用於表示萬用字元,允許您匹配給定位置的任何字元。
示例
import re pattern = r"b.ttle" text1 = "bottle" text2 = "battle" text3 = "bottle\n" match1 = re.search(pattern, text1) match2 = re.search(pattern, text2) match3 = re.search(pattern, text3) print(match1) print(match2) print(match3)
輸出
<re.Match object; span=(0, 6), match='bottle'> <re.Match object; span=(0, 6), match='battle'> <re.Match object; span=(0, 6), match='bottle'>
在上面的示例中,點元字元 . 用於匹配模式 b.ttle 中的任何字元。它成功匹配了“bottle”和“battle”,但未能匹配“bottle\n”,因為點不匹配換行符。
脫字元 (^) 和美元符號 ($) −脫字元和美元符號元字元分別表示行的開頭和結尾。它們用於將模式錨定在行的開頭或結尾。
示例
import re pattern1 = r"^Python" pattern2 = r"\d$" text1 = "Python is a powerful language" text2 = "The price is $10" match1 = re.search(pattern1, text1) match2 = re.search(pattern2, text2) print(match1) print(match2)
輸出
<re.Match object; span=(0, 6), match='Python'> <re.Match object; span=(15, 16), match='0'>
在上面的示例中,脫字元 ^ 用於將模式“Python”錨定在行的開頭,在 text1 中成功匹配它。美元符號 $ 用於將模式 \d(匹配任何數字)錨定在行的末尾,在 text2 中成功匹配數字“0”。
方括號 ([...]) − 方括號用於建立字元類,允許您匹配指定字元集中單個字元。您可以在括號中包含多個字元或範圍。
示例
import re pattern = r"[aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
輸出
['e', 'o', 'o']
在上面的示例中,模式 [aeiou] 用於匹配文字中的任何母音字元。findall() 函式返回找到的所有匹配項的列表,在本例中為字元“e”、“o”和“o”。
管道符 (|) − 管道字元用作 OR 運算子,允許您匹配左側或右側的模式。
示例
import re pattern = r"cat|dog" text = "I have a cat and a dog" match = re.search(pattern, text) print(match)
輸出
<re.Match object; span=(9, 12), match='cat'>
在上面的示例中,模式 cat|dog 匹配“cat”或“dog”。search() 函式返回找到的第一個匹配項,在本例中為“cat”。
這些只是 Python 正則表示式中常用元字元的一些示例。在下一節中,我們將探討字元類和量詞,以進一步增強我們的模式匹配能力。
字元類和量詞
字元類和量詞在定義正則表示式模式時提供了額外的靈活性和控制。在本節中,我們將深入探討這些功能,並學習如何有效地使用它們。
字元類 − 字元類允許您指定一組可以在模式中特定位置匹配的字元。它們包含在方括號 [ ] 中,並提供了一種方法來匹配定義集中任何單個字元。
示例
import re pattern = r"[aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
輸出
['e', 'o', 'o']
在上面的示例中,字元類 [aeiou] 匹配文字中的任何母音字元。findall() 函式返回找到的所有匹配項的列表,在本例中為字元“e”、“o”和“o”。
否定字元類 − 否定字元類允許您匹配定義集中不存在的任何字元。它們透過在字元類的開頭包含脫字元 ^ 來表示。
示例
import re pattern = r"[^aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
輸出
['H', 'l', 'l', ',', ' ', 'W', 'r', 'l', 'd', '!']
在上面的示例中,否定字元類 [^aeiou] 匹配任何不是母音的字元。findall() 函式返回找到的所有匹配項的列表,其中包括所有子音字元和標點符號。
量詞 − Quantifiers 允許您指定應匹配的模式出現的次數。它們可以應用於單個字元、字元類或模式組 −
− 匹配前一個模式的零次或多次出現。
+ − 匹配前一個模式的一次或多次出現。
? − 匹配前一個模式的零次或一次出現。
{n} − 匹配前一個模式的恰好 n 次出現。
{n,} − 匹配前一個模式的至少 n 次出現。
{n,m} − 匹配前一個模式的 n 到 m 次出現。
示例
import re pattern = r"ab*c" text1 = "ac" text2 = "abc" text3 = "abbbbc" match1 = re.search(pattern, text1) match2 = re.search(pattern, text2) match3 = re.search(pattern, text3) print(match1) print(match2) print(match3)
輸出
<re.Match object; span=(0, 2), match='ac'> <re.Match object; span=(0, 3), match='abc'> <re.Match object; span=(0, 6), match='abbbbc'>
在上面的示例中,量詞 * 用於匹配模式 ab*c 中字元“b”的零次或多次出現。它成功匹配了“ac”、“abc”和“abbbbc”,因為字元“b”是可選的。
透過組合字元類、否定字元類和量詞,您可以建立強大且靈活的正則表示式模式,以匹配給定文字中的各種模式。
在下一節中,我們將探討 Python 正則表示式更高階的功能,包括捕獲組、錨點和前瞻。
捕獲組、錨點和前瞻
捕獲組、錨點和前瞻是 Python 正則表示式的高階功能,它們提供了對模式匹配的更多控制。在本節中,我們將探討這些功能,並瞭解如何有效地使用它們。
捕獲組 − 捕獲組允許您在更大的模式中定義子模式並提取匹配的內容。它們使用括號 ( ) 定義,並且在您想提取匹配項的特定部分時很有用。
示例
import re
pattern = r"(\d{2})-(\d{2})-(\d{4})"
text = "Date of Birth: 01-23-1990"
match = re.search(pattern, text)
if match:
day = match.group(1)
month = match.group(2)
year = match.group(3)
print(f"Day: {day}, Month: {month}, Year: {year}")
輸出
Day: 01, Month: 23, Year: 1990
在上面的示例中,模式 (\d{2})-(\d{2})-(\d{4}) 定義了三個捕獲組以匹配日期格式中的日、月和年。search() 函式返回一個匹配物件,並且 group() 方法用於提取匹配的值。輸出將為“Day: 01, Month: 23, Year: 1990”。
錨點 − 錨點用於指定文字中應發生匹配的位置。它們不匹配任何字元,而是斷言有關周圍文字的條件。兩個常用的錨點是 ^ 和 $。
^ − 匹配字串的開頭。
$ − 匹配字串的結尾。
示例
import re
pattern = r"^Python"
text = "Python is a popular programming language"
match = re.search(pattern, text)
if match:
print("Match found!")
else:
print("No match found.")
輸出
Match found!
在上面的示例中,模式 ^Python 僅當“Python”出現在文字開頭時才匹配該單詞。由於文字以“Python”開頭,因此找到了匹配項,並列印了相應的郵件。
前瞻斷言− 前瞻斷言用於指定模式匹配發生時必須滿足的條件。它們用 (?=...) 表示正向前瞻斷言,用 (?!...) 表示負向前瞻斷言。
示例
import re pattern = r"\b\w+(?=ing\b)" text = "Walking is good for health" matches = re.findall(pattern, text) print(matches)
輸出
['Walk']
在上面的示例中,模式 \b\w+(?=ing\b) 匹配任何後跟字尾“ing”的單詞。正向前瞻斷言 (?=ing\b) 斷言該單詞應後跟“ing”,但它不是實際匹配的一部分。findall() 函式返回所有匹配單詞的列表,在本例中為“Walk”。
透過利用捕獲組、錨點和前瞻斷言,您可以建立更復雜的正則表示式模式,以精確匹配和提取文字中的特定內容。
在下一節中,我們將探討 Python 正則表示式的其他高階功能,包括反向引用、標誌和高階修飾符。
反向引用、標誌和高階修飾符
反向引用、標誌和高階修飾符是 Python 正則表示式中強大的功能,可以增強模式匹配功能。在本節中,我們將深入探討這些功能,並學習如何有效地利用它們。
反向引用− 反向引用允許您在模式中引用先前捕獲的組。它們用反斜槓 \ 後跟組號或組名錶示。當您想要匹配重複模式或確保匹配內容的一致性時,反向引用非常有用。
示例
import re
pattern = r"(\w+)\s+\1"
text = "hello hello"
match = re.search(pattern, text)
if match:
print("Match found!")
else:
print("No match found.")
輸出
Match found!
在上面的示例中,模式 (\w+)\s+\1 匹配一個單詞後跟一個或多個空格,然後是同一個單詞。反向引用 \1 指的是第一個捕獲組,它確保重複了同一個單詞。由於文字包含“hello hello”,因此找到了匹配項,並列印了相應的提示資訊。
標誌− 標誌修改正則表示式模式匹配的行為。它們用 re 模組常量表示,可以作為可選引數傳遞給正則表示式函式。一些常用的標誌如下:−
re.IGNORECASE − 匹配時忽略大小寫。
re.MULTILINE − 啟用多行匹配。
re.DOTALL − 允許點 (.) 匹配任何字元,包括換行符。
示例
import re
pattern = r"python"
text = "Python is a popular programming language"
match = re.search(pattern, text, re.IGNORECASE)
if match:
print("Match found!")
else:
print("No match found.")
輸出
Match found!
在上面的示例中,模式 python 與文字一起使用 re.IGNORECASE 標誌進行匹配。因此,大小寫差異被忽略,即使單詞“Python”以大寫字母開頭,也會找到匹配項。
高階修飾符 − 高階修飾符提供了對正則表示式匹配行為的額外控制。它們用放置在正則表示式模式結束分隔符後的特殊字元表示。
? − 使前一個模式可選(匹配 0 次或 1 次)。
− 匹配前一個模式的 0 次或多次出現。
+ − 匹配前一個模式的 1 次或多次出現。
{m} − 精確匹配前一個模式的 m 次出現。
{m, n} − 匹配前一個模式的 m 到 n 次出現。
示例
import re pattern = r"apples?|bananas?" text = "I like apple and bananas" matches = re.findall(pattern, text) print(matches)
輸出
['apple', 'bananas']
在上面的示例中,模式 apples?|bananas? 匹配“apple”或“apples”以及“banana”或“bananas”。? 修飾符使前一個字元或組可選,允許匹配水果名稱的單數和複數形式。
透過使用反向引用、標誌和高階修飾符,您可以建立更靈活和動態的正則表示式模式來處理各種匹配場景。
在下一節中,我們將討論常見的正則表示式陷阱和最佳實踐,以提高您的正則表示式技能。
常見的正則表示式陷阱和最佳實踐
雖然正則表示式是用於模式匹配和文字操作的強大工具,但如果使用不當,也可能容易出現陷阱。在本節中,我們將探討一些常見的陷阱,並提供最佳實踐來幫助您避免這些陷阱。
貪婪匹配與非貪婪匹配正則表示式的常見陷阱之一是其貪婪匹配行為,其中模式儘可能多地匹配。這可能導致意外結果,尤其是在使用 * 和 + 等量詞時。為了減輕這種情況,您可以使用非貪婪修飾符 *? 和 +? 以儘可能少的匹配。
示例
import re text = "<html><body><h1>Title</h1></body></html>" pattern = r"<.*?>" matches = re.findall(pattern, text) print(matches)
輸出
['<html>', '<body>', '<h1>', '</h1>', '</body>', '</html>']
在上面的示例中,模式 <.*?> 匹配 HTML 標籤。.*? 非貪婪修飾符確保匹配在 > 的第一次出現時停止。如果沒有非貪婪修飾符,匹配將跨越整個文字,包括多個標籤。
錨定匹配 − 錨定匹配可以防止在文字中意外位置出現意外匹配。錨點是特殊字元,用於標記行首 (^) 和行尾 ($) 或整個文字。
示例
import re text = "The quick brown fox jumps over the lazy dog." pattern = r"\bfox\b" matches = re.findall(pattern, text) print(matches) # Output: ['fox']
輸出
['fox']
在上面的示例中,模式 \bfox\b 將“fox”匹配為整個單詞。\b 錨點確保“fox”不會作為另一個單詞的一部分進行匹配,例如“foxy”或“foxes”。
複雜的巢狀模式在處理涉及巢狀組的複雜模式時,務必使用命名組和適當的模式組織來提高可讀性和可維護性。
示例
import re
text = "Date: 2022-01-01, Time: 12:00 PM"
pattern = r"Date: (?P<date>\d{4}-\d{2}-\d{2}), Time: (?P<time>\d{2}:\d{2} [AP]M)"
match = re.search(pattern, text)
if match:
date = match.group("date")
time = match.group("time")
print(f"Date: {date}, Time: {time}")
輸出
Date: 2022-01-01, Time: 12:00 PM
在上面的示例中,模式使用命名組 (?P<name>pattern) 來捕獲日期和時間資訊。這種方法提高了程式碼的可讀性,並允許使用組名輕鬆訪問捕獲的值。
結論
正則表示式是 Python 中用於模式匹配和文字操作的強大工具。透過理解基本語法、元字元和常見的正則表示式技巧,您可以釋放處理文字資料的廣泛可能性。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP