從基礎到程式碼實戰,帶你進階正規表示式的全方位應用

华为云开发者联盟發表於2024-03-14

本文分享自華為雲社群《Regex Mastery: 從基礎到高階,解鎖正規表示式的全方位應用》,作者:檸檬味擁抱。

正規表示式是一種強大的文字匹配和處理工具,廣泛應用於文字處理、資料抽取、表單驗證等領域。本文將從正規表示式的基礎知識出發,逐步深入,最終結合程式碼實戰,帶你全面瞭解正規表示式的奧妙。

正規表示式基礎

1. 什麼是正規表示式?

正規表示式是一種描述字串匹配規則的文字模式,可以用來檢索、替換、驗證等操作。它由一系列字元和運算子組成,表示一種匹配規則。

2. 基礎語法

  • 字元匹配: 使用普通字元直接匹配文字,如 abc 匹配字串中的 “abc”。
  • 元字元: 具有特殊意義的字元,如 . 表示匹配任意字元,^ 表示匹配字串的開頭。
  • 字元類: 用方括號表示,如 [aeiou] 匹配任何一個母音字母。

3. 量詞和邊界

  • 量詞: 用於指定匹配的次數,如 * 表示零次或多次,+ 表示一次或多次,? 表示零次或一次。
  • 邊界: 使用 ^ 表示字串的開頭,$ 表示字串的結尾。

正規表示式程式碼實戰

1. 使用正規表示式驗證郵箱

import re

def 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 re

html_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 re

text = "今天是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 re

def 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 re

text = "請聯絡客戶:+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 re

csv_data = "apple,orange,banana,grape"

# 使用正規表示式拆分
items = re.split(r',', csv_data)

# 輸出拆分結果
print("拆分後的結果:", items)

7. 使用正規表示式驗證URL

import re

def 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 re

html_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 re

text = "這個單詞是重複重複的,但是它們都是有意義的重複。"

# 匹配連續重複的單詞
repeated_words = re.findall(r'\b(\w+)\s+\1\b', text)

# 輸出匹配結果
print("連續重複的單詞:", repeated_words)

10. 使用正規表示式提取日誌資訊

import re

log_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 = entry
    print(f"{timestamp} - [{log_level}] {message}")

11. 使用正規表示式進行文字替換

import re

text = "這是一個示例文字,包含一些需要替換的詞彙,例如apple和orange。"

# 替換文字中的水果名稱
replaced_text = re.sub(r'\b(apple|orange)\b', 'fruit', text)

print(f"替換前: {text}")
print(f"替換後: {replaced_text}")

12. 匹配多行文字

import re

multiline_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 re

text = "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 = match
    print(f"時間: {timestamp}, 程序: {process_name}")

14. 非貪婪匹配

正規表示式預設是貪婪匹配,即儘可能匹配更多的字元。在量詞後加上?可以實現非貪婪匹配。

import re

text = "<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 re

def 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 re

text = "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 re

def 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 re

def 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地址,以及利用回撥函式實現更復雜的替換邏輯。

透過這篇文章,讀者不僅學到了正規表示式的基礎知識,還深入瞭解了它在實際程式設計中的廣泛應用。正規表示式作為文字處理的得力工具,能夠提高開發效率,簡化程式碼邏輯。希望本文的內容能夠幫助讀者更自信、更靈活地運用正規表示式解決實際問題,同時也鼓勵進一步深入學習和探索這一強大工具。如有任何問題或疑問,歡迎隨時提問,共同學習進步。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章