從基礎到代碼實戰,帶你進階正則表達式的全方位應用

本文分享自華爲雲社區《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("[email protected]")
validate_email("[email protected]")

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 或者發送郵件至[email protected]"

# 提取手機號碼
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地址,以及利用回調函數實現更復雜的替換邏輯。

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章