本文分享自華為雲社群《Python 正規表示式大揭秘應用與技巧全解析》,作者:檸檬味擁抱。
Python 中的 re 模組是用於處理正規表示式的強大工具。正規表示式是一種用來匹配字串的模式,它可以在文字中搜尋和匹配特定的字串模式。在本文中,我們將探討 Python 中 re 模組的應用和一些技巧,幫助您更好地理解和利用正規表示式。
1. 匯入 re 模組
在開始之前,首先要確保已經匯入了 re 模組:
import re
2. 使用 re 模組進行匹配
以下是一個簡單的示例,演示如何使用 re 模組在字串中查詢特定模式的匹配項:
text = "The quick brown fox jumps over the lazy dog" # 使用 re 模組查詢匹配項 matches = re.findall(r'\b\w{3}\b', text) print(matches) # 輸出匹配的單詞列表
在上面的示例中,我們使用了 \b\w{3}\b
這個正規表示式來匹配長度為3的單詞。\b
表示單詞的邊界,\w{3}
表示匹配三個字母字元。re.findall()
函式返回所有匹配的結果。
3. 使用分組
分組是正規表示式中的一個強大功能,它允許您對匹配的部分進行分組處理。以下是一個示例,演示如何使用分組從文字中提取出郵件地址:
text = "Contact us at: support@example.com, sales@example.com" # 使用分組提取郵件地址 emails = re.findall(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', text) print(emails) # 輸出提取的郵件地址列表
在上面的示例中,([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})
是一個匹配郵件地址的正規表示式。其中,()
將整個郵件地址作為一個分組,使得 re.findall()
函式只返回匹配的郵件地址部分。
4. 替換文字中的字串
re 模組還提供了替換功能,允許您使用正規表示式來替換文字中的特定字串。以下是一個示例,演示如何將文字中的所有數字替換為 “X”:
text = "There are 123 apples and 456 oranges" # 使用 re.sub() 函式替換文字中的數字為 "X" new_text = re.sub(r'\d+', 'X', text) print(new_text) # 輸出替換後的文字
在上面的示例中,re.sub(r'\d+', 'X', text)
使用正規表示式 \d+
匹配一個或多個數字,並將其替換為 “X”。
5. 使用編譯的正規表示式
在處理大量文字時,編譯正規表示式可以提高匹配效率。以下是一個示例,演示如何使用編譯後的正規表示式進行匹配:
pattern = re.compile(r'\bpython\b', re.IGNORECASE) text = "Python is a popular programming language" # 使用編譯後的正規表示式進行匹配 match = pattern.search(text) if match: print("Found") else: print("Not found")
在上面的示例中,re.compile()
函式編譯了一個不區分大小寫的正規表示式,並且使用 search()
方法進行匹配。
透過掌握以上技巧,您可以更加靈活和高效地使用 Python 中的 re 模組進行正規表示式的處理。正規表示式是一項強大的技能,在處理文字和字串時非常有用。
6. 使用預定義字元類
正規表示式中有一些預定義的字元類,可以簡化匹配特定型別字元的操作。以下是一些常用的預定義字元類及其示例用法:
\d
:匹配任意數字字元。\w
:匹配任意字母、數字或下劃線字元。\s
:匹配任意空白字元(空格、製表符、換行符等)。
text = "The code is 1234 and the password is abcd_123" # 使用預定義字元類匹配數字和字母密碼 codes = re.findall(r'\b\w+\b', text) print(codes) # 輸出匹配的程式碼和密碼列表
7. 使用量詞
量詞用於指定匹配字元或組的數量。以下是一些常用的量詞及其示例用法:
*
:匹配前一個字元零次或多次。+
:匹配前一個字元一次或多次。?
:匹配前一個字元零次或一次。{n}
:匹配前一個字元恰好 n 次。{n,}
:匹配前一個字元至少 n 次。{n,m}
:匹配前一個字元至少 n 次,但不超過 m 次。
text = "The Python programming language is widely used for data analysis" # 使用量詞匹配至少包含兩個字母的單詞 words = re.findall(r'\b\w{2,}\b', text) print(words) # 輸出匹配的單詞列表
8. 使用錨點
錨點用於匹配字串的邊界,而不是實際的字元。以下是一些常用的錨點及其示例用法:
^
:匹配字串的開頭。$
:匹配字串的結尾。\b
:匹配單詞的邊界。
text = "Python is a great language for both beginners and experts" # 使用錨點匹配以 Python 開頭的句子 sentence = re.findall(r'^Python.*', text) print(sentence) # 輸出匹配的句子
9. 貪婪與非貪婪匹配
在正規表示式中,量詞預設是貪婪的,即它們會盡可能匹配最長的字串。但有時候我們希望匹配最短的字串,這時候就需要使用非貪婪匹配。在量詞後面加上 ?
符號可以將其變為非貪婪匹配。
text = "Python is a powerful programming language" # 使用貪婪匹配查詢 "p" 到 "g" 之間的內容 greedy_match = re.findall(r'p.*g', text) # 使用非貪婪匹配查詢 "p" 到 "g" 之間的內容 non_greedy_match = re.findall(r'p.*?g', text) print("貪婪匹配:", greedy_match) # 輸出貪婪匹配結果 print("非貪婪匹配:", non_greedy_match) # 輸出非貪婪匹配結果
10. 使用後向引用
後向引用允許您在正規表示式中引用先前匹配的內容。這在需要匹配重複的模式時非常有用。
text = "apple apple orange orange" # 使用後向引用匹配重複的單詞 duplicates = re.findall(r'(\b\w+\b) \1', text) print("重複的單詞:", duplicates) # 輸出匹配到的重複單詞列表
11. 多行匹配
有時候我們需要匹配多行文字,而不僅僅是單行。這時可以使用 re.MULTILINE
標誌來啟用多行匹配模式。
text = """Python is a popular programming language. It is used for web development, data analysis, and more. Python has a simple syntax and is easy to learn.""" # 使用多行匹配模式匹配以大寫字母開頭的句子 sentences = re.findall(r'^[A-Z].*$', text, re.MULTILINE) print("以大寫字母開頭的句子:", sentences) # 輸出匹配到的句子列表
12. 使用命名分組
在複雜的正規表示式中,為了增加可讀性和維護性,可以使用命名分組來標識匹配的部分。
text = "John has 5 apples, Mary has 3 oranges" # 使用命名分組提取人名和水果數量 matches = re.findall(r'(?P<name>\w+) has (?P<quantity>\d+) \w+', text) for match in matches: print("Name:", match['name'], "- Quantity:", match['quantity'])
以上是一些高階技巧,可以進一步擴充套件您對正規表示式的應用和理解。透過不斷練習和嘗試,您將能夠更靈活地應用正規表示式來解決各種文字處理問題。
13. 使用預搜尋斷言
預搜尋斷言允許您在匹配字串時,指定字串之前或之後的條件。它不會消耗匹配的字元,僅用於指定條件。
text = "apple banana orange grape" # 使用預搜尋斷言匹配出包含 "apple" 之後的所有水果 result = re.findall(r'(?<=apple\s)(\w+)', text) print("包含 'apple' 之後的水果:", result) # 輸出匹配到的水果列表
14. 使用肯定與否定預搜尋斷言
肯定預搜尋斷言 (?=...)
匹配滿足條件的字串,而否定預搜尋斷言 (?!)
匹配不滿足條件的字串。
text = "Python is a powerful programming language" # 使用肯定預搜尋斷言匹配包含 "is" 的單詞 positive_result = re.findall(r'\b\w+(?= is\b)', text) # 使用否定預搜尋斷言匹配不包含 "is" 的單詞 negative_result = re.findall(r'\b\w+(?! is\b)', text) print("肯定預搜尋斷言:", positive_result) # 輸出匹配到的單詞列表 print("否定預搜尋斷言:", negative_result) # 輸出匹配到的單詞列表
15. 使用 re.finditer() 函式
re.finditer()
函式與 re.findall()
函式類似,但它返回一個迭代器,可以逐個訪問匹配物件。
text = "Python is a powerful programming language" # 使用 re.finditer() 函式匹配所有單詞 matches_iter = re.finditer(r'\b\w+\b', text) for match in matches_iter: print(match.group()) # 輸出匹配到的單詞
16. 使用 re.split() 函式
除了匹配和查詢文字模式,re
模組還提供了 re.split()
函式,用於根據正規表示式模式拆分字串。
text = "apple,banana,orange,grape" # 使用 re.split() 函式根據逗號拆分字串 fruits = re.split(r',', text) print("拆分後的水果列表:", fruits) # 輸出拆分後的水果列表
17. 使用 re.sub() 函式的替換函式引數
re.sub()
函式的第二個引數可以是一個函式,用於處理匹配的結果後再替換。
def double(match): return str(int(match.group(0)) * 2) text = "The numbers are 1, 2, 3, and 4" # 使用替換函式引數將所有數字乘以2 new_text = re.sub(r'\d+', double, text) print("替換後的文字:", new_text) # 輸出替換後的文字
18. 使用 re.fullmatch() 函式
re.fullmatch()
函式用於檢查整個字串是否完全匹配給定的模式。
pattern = re.compile(r'\d{4}-\d{2}-\d{2}') date1 = "2022-01-15" date2 = "15-01-2022" # 使用 re.fullmatch() 函式檢查日期格式 match1 = pattern.fullmatch(date1) match2 = pattern.fullmatch(date2) if match1: print("日期格式正確") else: print("日期格式錯誤") if match2: print("日期格式正確") else: print("日期格式錯誤")
19. 使用 re.IGNORECASE 標誌進行不區分大小寫匹配
在編譯正規表示式時,可以使用 re.IGNORECASE
標誌來進行不區分大小寫的匹配。
pattern = re.compile(r'python', re.IGNORECASE) text = "Python is a powerful programming language" # 使用不區分大小寫匹配模式查詢 "Python" match = pattern.search(text) if match: print("Found") else: print("Not found")
20. 使用 re.DEBUG 標誌進行正規表示式除錯
在編譯正規表示式時,可以使用 re.DEBUG
標誌來輸出正規表示式的除錯資訊,以便更好地理解它的工作原理。
pattern = re.compile(r'\b\w{3}\b', re.DEBUG) text = "The quick brown fox jumps over the lazy dog" # 輸出編譯後的正規表示式除錯資訊 pattern.findall(text)
透過繼續學習和實踐這些高階的正規表示式技巧,您將能夠更好地應用正規表示式來處理各種文字匹配和處理任務,提高程式碼的效率和可維護性。正規表示式是 Python 中強大而靈活的工具之一,對於處理字串模式非常有用。
總結
透過本文的介紹,我們探索了 Python 中 re 模組的應用與技巧,使您能夠更靈活和高效地處理正規表示式。我們從基礎的模式匹配開始,介紹瞭如何使用 re 模組進行匹配、分組、替換等操作。隨後,我們深入探討了一些高階技巧,包括貪婪與非貪婪匹配、後向引用、多行匹配、預搜尋斷言等,這些技巧可以幫助您更好地處理複雜的文字處理任務。此外,我們還介紹了一些實用的函式和標誌,如 re.split()
、re.sub()
的替換函式引數、re.fullmatch()
、re.IGNORECASE
、re.DEBUG
等,使您能夠更靈活地應用正規表示式解決實際問題。
掌握正規表示式是 Python 程式設計中非常重要的一部分,它能夠幫助我們更快地處理字串模式匹配、文字提取等任務,提高程式碼的效率和可維護性。透過不斷學習和實踐,您將能夠更深入地理解和應用正規表示式,解決各種文字處理問題,提升自己在 Python 程式設計中的技能水平。希望本文對您有所幫助,歡迎繼續探索和學習更多關於正規表示式的知識。
點選關注,第一時間瞭解華為雲新鮮技術~