Python正則表達式:從基礎到高級應用的全面總結與實戰
正則表達式是一種強大的文本匹配和處理工具,廣泛應用于文本處理、數據抽取、表單驗證等領域。本文將從正則表達式的基礎知識出發,逐步深入,最終結合代碼實戰,帶你全面了解正則表達式的奧妙。
正則表達式基礎
1. 什么是正則表達式?
正則表達式是一種描述字符串匹配規則的文本模式,可以用來檢索、替換、驗證等操作。它由一系列字符和操作符組成,表示一種匹配規則。
2. 基礎語法
- 字符匹配: 使用普通字符直接匹配文本,如
abc
匹配字符串中的 “abc”。 - 元字符: 具有特殊意義的字符,如
.
表示匹配任意字符,^
表示匹配字符串的開頭。 - 字符類: 用方括號表示,如
[aeiou]
匹配任何一個元音字母。
3. 量詞和邊界
- 量詞: 用于指定匹配的次數,如
*
表示零次或多次,+
表示一次或多次,?
表示零次或一次。 - 邊界: 使用
^
表示字符串的開頭,$
表示字符串的結尾。
正則表達式代碼實戰
1. 使用正則表達式驗證郵箱
import redef validate_email(email):pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'if re.match(pattern, email):print(f"{email} 是一個有效的郵箱地址")else:print(f"{email} 不是一個有效的郵箱地址")# 測試
validate_email("user@example.com")
validate_email("invalid_email@.com")
2. 提取HTML中的鏈接
import rehtml_content = '<a href="https://www.example.com">Visit our website</a>'# 提取鏈接
links = re.findall(r'href="([^"]*)"', html_content)# 輸出鏈接
for link in links:print(f"鏈接: {link}")
3. 替換文本中的日期格式
import retext = "今天是2024年2月27日,明天是2024-02-28。"# 替換日期格式
formatted_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)print(f"替換前: {text}")
print(f"替換后: {formatted_text}")
4. 使用正則表達式判斷密碼強度
import redef check_password_strength(password):# 至少8個字符,包含至少一個大寫字母、一個小寫字母、一個數字和一個特殊字符pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'if re.match(pattern, password):print("密碼強度符合要求")else:print("密碼強度不夠")# 測試
check_password_strength("StrongPass123!")
check_password_strength("weakpassword")
5. 從文本中提取手機號碼
import retext = "請聯系客戶:+86 13812345678 或者發送郵件至info@example.com"# 提取手機號碼
phone_numbers = re.findall(r'(?:(?:\+|00)86)?1[345789]\d{9}', text)# 輸出手機號碼
for number in phone_numbers:print(f"手機號碼: {number}")
6. 拆分逗號分隔的字符串
import recsv_data = "apple,orange,banana,grape"# 使用正則表達式拆分
items = re.split(r',', csv_data)# 輸出拆分結果
print("拆分后的結果:", items)
7. 使用正則表達式驗證URL
import redef validate_url(url):# 簡單的URL驗證,以http或https開頭,后面跟著域名pattern = r'^(https?://)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:/[^/#?]+)*(?:\?[^#]*)?(?:#(.*))?$'if re.match(pattern, url):print(f"{url} 是一個有效的URL")else:print(f"{url} 不是一個有效的URL")# 測試
validate_url("https://www.example.com")
validate_url("ftp://invalid-url.com")
8. 從HTML中提取文本內容
import rehtml_content = '<p>This is a <b>sample</b> HTML content.</p>'# 提取純文本內容
text_content = re.sub(r'<[^>]+>', '', html_content)print(f"HTML內容: {html_content}")
print(f"提取后的文本內容: {text_content}")
9. 匹配重復字符
import retext = "這個單詞是重復重復的,但是它們都是有意義的重復。"# 匹配連續重復的單詞
repeated_words = re.findall(r'\b(\w+)\s+\1\b', text)# 輸出匹配結果
print("連續重復的單詞:", repeated_words)
10. 使用正則表達式提取日志信息
import relog_data = """
2024-02-27 10:15: Error in module A
2024-02-27 11:30: Warning in module B
2024-02-27 12:45: Info: Application started
"""# 提取日志信息
log_entries = re.findall(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Error|Warning|Info): (.+)', log_data)# 輸出提取結果
for entry in log_entries:timestamp, log_level, message = entryprint(f"{timestamp} - [{log_level}] {message}")
11. 使用正則表達式進行文本替換
import retext = "這是一個示例文本,包含一些需要替換的詞匯,例如apple和orange。"# 替換文本中的水果名稱
replaced_text = re.sub(r'\b(apple|orange)\b', 'fruit', text)print(f"替換前: {text}")
print(f"替換后: {replaced_text}")
12. 匹配多行文本
import remultiline_text = """
This is line 1.
Another line here.
And a third line.
"""# 匹配包含"line"的行
matching_lines = re.findall(r'.*line.*', multiline_text, re.MULTILINE)# 輸出匹配結果
for line in matching_lines:print(f"匹配的行: {line}")
我們深入了解了正則表達式在處理日志、進行文本替換等實際場景中的應用。正則表達式的強大之處在于它的靈活性和通用性,可以適應各種文本處理需求。希望這些例子能夠進一步拓展你對正則表達式的認識,并激發你在實際項目中更廣泛地應用它的興趣。如果有其他關于正則表達式的問題或者需要更多的實例,歡迎繼續提問。
13. 正則表達式分組與捕獲
在正則表達式中,使用括號可以創建分組,通過分組可以實現更精細的匹配和捕獲。
import retext = "2024-02-27 08:30: Process A started, Process B started"# 匹配并捕獲時間和進程名稱
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Process [A-Z]) started'
matches = re.findall(pattern, text)# 輸出捕獲結果
for match in matches:timestamp, process_name = matchprint(f"時間: {timestamp}, 進程: {process_name}")
14. 非貪婪匹配
正則表達式默認是貪婪匹配,即盡可能匹配更多的字符。在量詞后加上?
可以實現非貪婪匹配。
import retext = "<b>bold text</b> and <i>italic text</i>"# 貪婪匹配
greedy_match = re.search(r'<.*>', text).group()# 非貪婪匹配
non_greedy_match = re.search(r'<.*?>', text).group()print(f"貪婪匹配: {greedy_match}")
print(f"非貪婪匹配: {non_greedy_match}")
15. 使用正則表達式驗證IP地址
import redef validate_ip_address(ip):pattern = r'^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$'if re.match(pattern, ip):print(f"{ip} 是一個有效的IP地址")else:print(f"{ip} 不是一個有效的IP地址")# 測試
validate_ip_address("192.168.0.1")
validate_ip_address("256.0.0.1")
通過這些高級的正則表達式實例,我們進一步提升了對正則表達式功能的理解和應用。分組、非貪婪匹配等特性使得正則表達式更加靈活和強大,能夠滿足更復雜的匹配需求。希望這些例子有助于你更深入地理解和運用正則表達式。如果你還有其他關于正則表達式的問題,歡迎提出。
16. 零寬斷言
零寬斷言是一種特殊的正則表達式結構,用于在匹配位置上添加條件,但并不消耗字符。常見的零寬斷言包括正向先行斷言((?=...)
)、負向先行斷言((?!...)
)、正向后行斷言((?<=...)
)、負向后行斷言((?<!...)
)等。
import retext = "apple orange banana"# 匹配單詞前面是"apple"的空格
positive_lookahead = re.search(r'apple(?=\s)', text).group()# 匹配單詞前面不是"apple"的空格
negative_lookahead = re.search(r'(?<!apple)\s', text).group()print(f"正向先行斷言: {positive_lookahead}")
print(f"負向先行斷言: {negative_lookahead}")
17. 使用正則表達式驗證日期格式
import redef validate_date(date):pattern = r'^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$'if re.match(pattern, date):print(f"{date} 是一個有效的日期格式")else:print(f"{date} 不是一個有效的日期格式")# 測試
validate_date("2024-02-27")
validate_date("2024/02/27")
18. 正則表達式的替換與回調函數
利用正則表達式進行替換時,可以結合回調函數,實現更復雜的替換邏輯。
import redef multiply(match):number = int(match.group(1))return str(number * 2)text = "Numbers: 2, 5, 8, 12"# 使用回調函數替換數字
result = re.sub(r'\b(\d+)\b', multiply, text)print(f"替換前: {text}")
print(f"替換后: {result}")
通過這些高級的正則表達式實例,我們深入了解了零寬斷言、日期格式驗證以及替換與回調函數的應用。這些功能強大的特性使得正則表達式成為處理復雜文本匹配和替換任務的得力工具。希望這些例子有助于你更靈活地運用正則表達式解決實際問題。如果你還有其他關于正則表達式的疑問或需求,歡迎繼續提問。
總結:
通過本文的內容,我們全面深入地探討了正則表達式的基礎知識和高級應用。在基礎部分,我們學習了正則表達式的基本概念、語法元素以及常見的匹配規則。隨后,我們通過多個實例展示了正則表達式在不同場景的代碼應用,包括郵箱驗證、HTML鏈接提取、文本替換、密碼強度驗證等。
在高級部分,我們介紹了正則表達式的進階特性,包括分組與捕獲、非貪婪匹配、零寬斷言等。這些特性使得正則表達式更加靈活,能夠應對更復雜的文本匹配需求。同時,我們還探討了如何使用正則表達式驗證日期格式、IP地址,以及利用回調函數實現更復雜的替換邏輯。
通過這篇文章,讀者不僅學到了正則表達式的基礎知識,還深入了解了它在實際編程中的廣泛應用。正則表達式作為文本處理的得力工具,能夠提高開發效率,簡化代碼邏輯。希望本文的內容能夠幫助讀者更自信、更靈活地運用正則表達式解決實際問題,同時也鼓勵進一步深入學習和探索這一強大工具。如有任何問題或疑問,歡迎隨時提問,共同學習進步。