2024-08-16|閱讀時間 ‧ 約 27 分鐘

[Python]Re正則表達式一些實用範例

紀錄一些,實用的re正則表達式需要用時,就可以直接複製貼上。


檢查是否有中文字

import re
def contains_chinese(text):
pattern = re.compile(r"[\u4e00-\u9fa5]")
return bool(pattern.search(text))

text = "Hello 你好"
print(contains_chinese(text)) # 輸出: True

text = "Hello World"
print(contains_chinese(text)) # 輸出: False
  • 正則表達式模式: [\u4e00-\u9fa5]
    這個模式用來匹配 Unicode 範圍在 \u4e00\u9fa5 之間的字符,這個範圍包括了大部分常用的中文字符。
  • 函式解釋:
    • re.compile(r"[\u4e00-\u9fa5]") 將正則表達式模式編譯成一個 pattern 對象。
    • pattern.search(text) 用來在字串 text 中搜尋是否有符合該模式的字符。
    • bool(pattern.search(text)) 將搜尋結果轉換為布林值,若找到中文字符,則返回 True,否則返回 False


匹配Email地址

email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
email = "example@mail.com"
email_match = re.match(email_pattern, email)
if email_match:
print("Email匹配結果:", email_match.group()) #輸出 example@mail.com

正則表達式模式:email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'

  • [a-zA-Z0-9_.+-]+: 匹配一個或多個字母、數字、底線 (_)、點 (.)、加號 (+) 或連字符 (-)。這表示Email地址的用戶名部分。
  • @: 匹配Email地址中的@符號。
  • [a-zA-Z0-9-]+: 匹配域名的第一部分,允許字母、數字和連字符。
  • \.: 匹配域名中的點 (.) 符號,因為點在正則表達式中是特殊字符,所以需要使用反斜杠來轉義。
  • [a-zA-Z0-9-.]+: 匹配域名的第二部分及後續部分,可以有點 (.) 和連字符。


匹配電話號碼

phone_pattern = r'\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}'
phone = "(123) 456-7890"
phone_match = re.match(phone_pattern, phone)

if phone_match:
print("電話號碼匹配結果:", phone_match.group()) #輸出 電話號碼匹配結果: (123) 456-7890
  • \(?: 匹配一個可選的左括號 (。括號需要轉義。
  • \d{3}: 匹配三個連續的數字。
  • \)?: 匹配一個可選的右括號 )
  • [-.\s]?: 匹配可選的連字符 (-)、點 (.) 或空格,[-.\s] 中的 \s 代表空白字符。
  • \d{3}: 匹配三個連續的數字。
  • [-.\s]?: 再次匹配可選的連字符、點或空格。
  • \d{4}: 匹配四個連續的數字。


網址(URL)匹配

url_pattern = r'https?://(?:www\.)?[-\w]+(?:\.\w[-\w]*)+'
url = "https://www.example.com"
url_match = re.match(url_pattern, url)
if url_match:
print("URL匹配結果:", url_match.group()) #URL匹配結果: https://www.example.com
  • https?://: 匹配 http://https://,問號 ? 表示 s 是可選的。
  • (?:www\.)?: 匹配可選的 www. 子域名,(?: ... ) 是非捕獲組,用於組合但不存儲匹配結果。
  • [-\w]+: 匹配域名的主要部分,可以包含字母、數字、下劃線 (_) 和連字符 (-)。
  • (?:\.\w[-\w]*)+: 匹配域名的後續部分,每部分以點 (.) 開頭,後面跟隨字母、數字或連字符。


匹配HTML標籤

html_pattern = r'<([a-zA-Z]+)([^>]*?)>(.*?)<\/\1>'
html = "<div class='test'>Hello World</div>"
html_match = re.match(html_pattern, html)

if html_match:
    print("HTML標籤匹配結果:", html_match.group())
#輸出 HTML標籤匹配結果: <div class='test'>Hello World</div>​
  • <([a-zA-Z]+): 匹配開頭的HTML標籤,([a-zA-Z]+) 捕獲標籤名稱,允許字母。
  • ([^>]*?): 匹配標籤中的屬性部分,非貪婪匹配 [^>]*?,允許任意字符但不包括 >
  • >(.*?)<\/\1>: 匹配標籤內的內容,(.*?) 是非貪婪匹配,並且使用 <\/\1> 匹配對應的閉合標籤,其中 \1 指向之前捕獲的標籤名稱。


匹配IPv4地址

ip_pattern = r'(\d{1,3}\.){3}\d{1,3}'
ip = "192.168.1.1"
ip_match = re.match(ip_pattern, ip)

if ip_match:
print("IPv4地址匹配結果:", ip_match.group())
  • \d{1,3}: 匹配1到3個數字,代表IP地址中的每個字節。
  • \.: 匹配點 (.),因為點在正則表達式中是特殊字符,所以需要使用反斜杠來轉義。
  • (\d{1,3}\.){3}: 匹配前三個字節,每個字節後面都有一個點,共出現三次。
  • \d{1,3}: 匹配最後一個字節。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.