Python 正则表达式实战(第5篇)

小飞兽 Python 2 次阅读 2026-07-24

正则表达式是处理文本的利器,本文全面讲解 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 正则表达式的核心知识点。