Python 正则表达式实战(第3篇)
正则表达式是处理文本的利器,本文全面讲解 Python re 模块的实战用法。
基本匹配
Python 用 re 模块处理正则表达式。
import re
简单匹配
pattern = r'\d{3}-\d{4}'
text = '我的电话是 123-4567'
match = re.search(pattern, text)
if match:
print(f'找到: {match.group()}')常用元字符
正则表达式有一整套元字符体系:
# \d 数字 \w 字母数字下划线 \s 空白字符
+ 一次或多次 * 零次或多次 ? 零次或一次
text = '张三 188-1234-5678'
phones = re.findall(r'\d{3}-\d{4}-\d{4}', text)
print(phones) # ['188-1234-5678']
替换
new_text = re.sub(r'\d{3}-\d{4}-\d{4}', '[电话号码]', text)
print(new_text) # '张三 [电话号码]'分组捕获
用圆括号创建分组,同时捕获多个部分:
log = '2024-01-15 ERROR: 连接失败'
pattern = r'(\d{4}-\d{2}-\d{2}) (\w+): (.+)'
match = re.search(pattern, log)
if match:
date, level, msg = match.groups()
print(f'日期:{date} 级别:{level} 消息:{msg}')贪婪 vs 非贪婪
默认是贪婪匹配,加 ? 变成非贪婪:
html = '内容1内容2'
贪婪:匹配到最后一个 </div>
result1 = re.search(r'.*', html)
非贪婪:匹配到第一个 </div>
result2 = re.search(r'.*?', html)编译正则提高性能
重复使用同一个正则时,先编译再匹配效率更高:
pattern = re.compile(r'^\w+@\w+\.\w+$')
emails = ['test@example.com', 'invalid', 'user@domain.org']
valid = [e for e in emails if pattern.match(e)]
print(valid) # ['test@example.com', 'user@domain.org']常见错误处理
正则写错会抛异常,记得加 try 保护:
try:
pattern = re.compile(r'[a-z') # 少了一个 ]
except re.error as e:
print(f'正则错误: {e}')以上就是 Python 正则表达式的核心知识点。