Python re 庫從入門到高階用法詳解
Python re 庫詳解:從入門到高階
正則表達式是處理字符串的強大工具,Python 的re模塊提供了對正則表達式的全面支持。本文將從基礎(chǔ)到高階詳細講解re庫的使用,并通過實例幫助理解。
一、入門:正則表達式基礎(chǔ)與 re 庫核心函數(shù)
1. 基本概念
正則表達式是由普通字符和特殊字符 (元字符) 組成的字符串模式,用于匹配字符串。
2. 核心函數(shù)
2.1re.match()- 從字符串開頭匹配
嘗試從字符串的起始位置匹配一個模式,若匹配成功返回匹配對象,否則返回 None。
import re # 示例1:匹配成功 result = re.match(r'hello', 'hello world') print(result.group()) # 輸出: hello # 示例2:匹配失?。ú皇菑拈_頭匹配) result = re.match(r'world', 'hello world') print(result) # 輸出: None
練習(xí)題:驗證一個字符串是否以字母開頭
def starts_with_letter(s):
return bool(re.match(r'^[a-zA-Z]', s))
print(starts_with_letter("hello")) # True
print(starts_with_letter("123hello")) # False2.2re.search()- 在整個字符串中搜索匹配
掃描整個字符串并返回第一個成功的匹配。
import re # 示例:在整個字符串中查找 result = re.search(r'world', 'hello world') print(result.group()) # 輸出: world
練習(xí)題:檢查字符串中是否包含數(shù)字
def has_number(s):
return bool(re.search(r'\d', s))
print(has_number("hello123")) # True
print(has_number("helloworld")) # False2.3re.findall()- 找到所有匹配項
找到所有匹配的子串,并以列表形式返回。
import re # 示例:找到所有數(shù)字 result = re.findall(r'\d+', 'age: 25, score: 98, weight: 65') print(result) # 輸出: ['25', '98', '65']
練習(xí)題:提取字符串中所有的郵箱地址
def extract_emails(s):
return re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', s)
text = "聯(lián)系我們: info@example.com, 銷售: sales@company.org"
print(extract_emails(text)) # ['info@example.com', 'sales@company.org']2.4re.sub()- 替換匹配項
替換字符串中所有匹配的子串。
import re # 示例:替換所有數(shù)字為* result = re.sub(r'\d+', '*', 'age: 25, score: 98') print(result) # 輸出: age: *, score: *
練習(xí)題:將字符串中的敏感信息(電話)打碼
def mask_phone(s):
return re.sub(r'1[3-9]\d{9}', '1xxxxxxxxx', s)
text = "我的電話是13812345678,他的電話是13987654321"
print(mask_phone(text)) # 我的電話是1xxxxxxxxx,他的電話是1xxxxxxxxx二、進階:正則表達式元字符與模式
1. 常用元字符
元字符 | 描述 | |
| 匹配任意字符(除換行符) | |
| 匹配字符串開頭 | |
| 匹配字符串結(jié)尾 | |
| 匹配前一個字符 0 次或多次 | |
| 匹配前一個字符 1 次或多次 | |
| 匹配前一個字符 0 次或 1 次 | |
| 匹配前一個字符恰好 n 次 | |
| 匹配前一個字符至少 n 次 | |
| 匹配前一個字符 n 到 m 次 | |
| 字符集,匹配其中任意一個字符 | |
` | ` | 匹配左右任意一個表達式 |
| 分組,將括號內(nèi)的作為一個整體 |
2. 特殊序列
序列 | 描述 |
| 匹配任意數(shù)字,等價于 [0-9] |
| 匹配任意非數(shù)字 |
| 匹配任意空白字符 |
| 匹配任意非空白字符 |
| 匹配字母、數(shù)字、下劃線 |
| 匹配非字母、數(shù)字、下劃線 |
| 匹配單詞邊界 |
3. 實例練習(xí)
3.1 匹配 IP 地址
import re
def is_valid_ip(ip):
pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$'
return bool(re.match(pattern, ip))
print(is_valid_ip("192.168.1.1")) # True
print(is_valid_ip("256.0.0.1")) # False3.2 提取 HTML 標簽內(nèi)容
import re
def extract_tag_content(html, tag):
pattern = rf'<{tag}>(.*?)</{tag}>'
return re.findall(pattern, html, re.DOTALL)
html = '''
<div>第一部分</div>
<div>第二部分</div>
<p>這是段落</p>
'''
print(extract_tag_content(html, 'div')) # ['第一部分', '第二部分']三、高階:編譯正則表達式與高級特性
1.re.compile()- 編譯正則表達式
編譯正則表達式為模式對象,可提高多次使用的效率。
import re
# 編譯正則表達式
pattern = re.compile(r'\d+')
# 使用編譯后的模式
print(pattern.findall('age: 25, score: 98')) # ['25', '98']
print(pattern.sub('*', 'age: 25, score: 98')) # age: *, score: *2. 匹配對象的方法
當匹配成功時,match()和search()返回匹配對象,包含以下常用方法:
group(): 返回匹配的字符串start(): 返回匹配的起始位置end(): 返回匹配的結(jié)束位置span(): 返回匹配的起始和結(jié)束位置的元組
import re result = re.search(r'(\d+)-(\d+)-(\d+)', '今天是2023-10-05') print(result.group()) # 2023-10-05 print(result.group(1)) # 2023 print(result.group(2)) # 10 print(result.group(3)) # 05 print(result.span()) # (3, 13)
3. 貪婪與非貪婪匹配
正則表達式默認是貪婪的,會盡可能匹配最長的字符串。在量詞后加?可啟用非貪婪模式。
import re # 貪婪匹配 text = '<div>內(nèi)容1</div><div>內(nèi)容2</div>' print(re.findall(r'<div>(.*)</div>', text)) # ['內(nèi)容1</div><div>內(nèi)容2'] # 非貪婪匹配 print(re.findall(r'<div>(.*?)</div>', text)) # ['內(nèi)容1', '內(nèi)容2']
4. 標志參數(shù)
re模塊的函數(shù)支持標志參數(shù),常用的有:
re.IGNORECASE或re.I: 忽略大小寫re.DOTALL或re.S: 使.匹配包括換行符在內(nèi)的所有字符re.MULTILINE或re.M: 多行模式
import re # 忽略大小寫 print(re.findall(r'hello', 'Hello HELLO hello', re.IGNORECASE)) # ['Hello', 'HELLO', 'hello'] # 多行模式 text = 'line1\nline2\nline3' print(re.findall(r'^line', text, re.MULTILINE)) # ['line', 'line', 'line']
5. 高階練習(xí)題
5.1 解析 URL 參數(shù)
import re
def parse_url_params(url):
params = {}
# 提取參數(shù)部分
match = re.search(r'\?(.*)$', url)
if match:
param_str = match.group(1)
# 分割參數(shù)
param_list = re.split(r'&', param_str)
for param in param_list:
# 分割鍵值對
key_value = re.split(r'=', param, 1)
if len(key_value) == 2:
params[key_value[0]] = key_value[1]
return params
url = "https://example.com/search?query=python&page=2&sort=desc"
print(parse_url_params(url))
# {'query': 'python', 'page': '2', 'sort': 'desc'}5.2 驗證密碼強度
import re
def check_password_strength(password):
# 至少8個字符,包含大小寫字母、數(shù)字和特殊字符
if len(password) < 8:
return "弱:密碼長度不足8位"
strength = 0
if re.search(r'[A-Z]', password):
strength += 1
if re.search(r'[a-z]', password):
strength += 1
if re.search(r'\d', password):
strength += 1
if re.search(r'[!@#$%^&*(),.?":{}|<>]', password):
strength += 1
if strength == 4:
return "強:密碼強度良好"
elif strength >= 2:
return "中:密碼強度一般"
else:
return "弱:密碼組成太簡單"
print(check_password_strength("123456")) # 弱:密碼長度不足8位
print(check_password_strength("abcdefgh")) # 弱:密碼組成太簡單
print(check_password_strength("Abcdefgh")) # 中:密碼強度一般
print(check_password_strength("Abcdefgh123")) # 中:密碼強度一般
print(check_password_strength("Abc@12345")) # 強:密碼強度良好四、總結(jié)
re庫是 Python 處理字符串的強大工具,掌握它可以極大提高字符串處理效率。本文從基礎(chǔ)函數(shù)到高級特性,涵蓋了re庫的主要用法:
- 入門:掌握
match()、search()、findall()、sub()等核心函數(shù) - 進階:熟悉元字符、特殊序列和常用模式
- 高階:學(xué)會編譯正則表達式、處理匹配對象、使用貪婪 / 非貪婪模式和標志參數(shù)
正則表達式的學(xué)習(xí)需要多練習(xí),通過實際問題來加深理解和記憶。隨著實踐的增多,你會發(fā)現(xiàn)正則表達式在文本處理中的巨大價值。
到此這篇關(guān)于Python re 庫詳解:從入門到高階的文章就介紹到這了,更多相關(guān)Python re 庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
蘋果Macbook Pro13 M1芯片安裝Pillow的方法步驟
Pillow作為python的第三方圖像處理庫,提供了廣泛的文件格式支持,本文主要介紹了蘋果Macbook Pro13 M1芯片安裝Pillow,具有一定的參考價值,感興趣的可以了解一下2021-11-11
pytorch中部分矩陣乘法和數(shù)組乘法的小結(jié)
本文主要介紹了pytorch中部分矩陣乘法和數(shù)組乘法的小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
用Python將IP地址在整型和字符串之間輕松轉(zhuǎn)換
這篇文章主要給大家介紹了利用Python將IP在整型和字符串之間輕松轉(zhuǎn)換的相關(guān)資料,文中還跟大家分享了Python下利用正則表達式來匹配校驗一個字符串是否為ip地址的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
Pandas查詢數(shù)據(jù)df.query的使用
本文主要介紹了Pandas查詢數(shù)據(jù)df.query的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

