Python 的 re 模块提供了正则表达式的完整支持。理解下面五个最常用的方法,你就能应对 90% 的正则处理场景。
re.match(pattern, string, flags=0)
- 行为:从字符串的开头开始尝试匹配。如果开头位置匹配成功,返回一个匹配对象;否则返回
None。 - 典型用法:验证某个字符串是否以特定模式开头,比如检查手机号首位、网址协议等。
- 示例:
import re
result = re.match(r'\d+', '123abc')
if result:
print(result.group()) # 输出: 123
# 注意:字符串开头不是数字就会失败
result2 = re.match(r'\d+', 'abc123')
print(result2) # None
re.search(pattern, string, flags=0)
- 行为:扫描整个字符串,返回第一个成功匹配的对象。如果没有匹配,返回
None。 - 典型用法:找到字符串中第一次出现的模式,不需要从开头限定。
- 示例:
text = "价格是 100 元"
m = re.search(r'\d+', text)
if m:
print(m.group()) # 输出: 100
# 与 match 的区别:search 不要求从开头匹配
m2 = re.search(r'\d+', 'abc123def')
print(m2.group()) # 输出: 123
re.findall(pattern, string, flags=0)
- 行为:以列表形式返回字符串中所有不重叠匹配的字符串。如果正则中包含捕获组 (
()),则返回的是元组列表(每个元组包含各组的捕获内容)。 - 典型用法:提取文本中所有出现的模式,比如找出所有邮箱、所有数字等。
- 示例:
text = "a1b2c3"
print(re.findall(r'\d', text)) # ['1', '2', '3']
# 带捕获组时返回元组列表
print(re.findall(r'(\d)([a-z])', '1a2b3c')) # [('1', 'a'), ('2', 'b'), ('3', 'c')]
re.sub(pattern, repl, string, count=0, flags=0)
- 行为:搜索字符串中的模式,并用
repl替换。默认替换所有匹配,可通过count参数限制替换次数。返回替换后的新字符串,原字符串不变。 repl可以是字符串或函数:字符串中可用\1、\g<name>引用捕获组;函数接收匹配对象,返回替换字符串。- 典型用法:清洗数据(去除空格、格式化)、掩码敏感信息、文本转换。
- 示例:
# 简单替换
text = "I like cat and cat"
new_text = re.sub(r'cat', 'dog', text)
print(new_text) # I like dog and dog
# 引用捕获组:日期格式转换
date_str = "2025-03-15"
new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', date_str)
print(new_date) # 03/15/2025
# 使用函数:将匹配的数字乘以 2
def double(m):
return str(int(m.group()) * 2)
print(re.sub(r'\d+', double, 'a1b2c3')) # a2b4c6
re.split(pattern, string, maxsplit=0, flags=0)
- 行为:用正则表达式指定的分隔符拆分字符串,功能比
str.split()更强大。返回拆分后的字符串列表。如果正则中包含捕获组,捕获的内容也会作为结果的一部分保留在列表中。 - 典型用法:按多种分隔符切分、处理空白字符、从杂乱文本中提取字段。
- 示例:
# 按空格、逗号或分号拆分
text = "a,b;c d"
parts = re.split(r'[ ,;]+', text)
print(parts) # ['a', 'b', 'c', 'd']
# 保留分隔符(使用捕获组)
parts2 = re.split(r'([ ,;])', text)
print(parts2) # ['a', ',', 'b', ';', 'c', ' ', 'd']
掌握了这五个方法,你基本就能完成字符串的验证、查找、提取、替换和拆分任务。在使用时,建议预先用 re.compile() 编译正则对象以提高多次使用时的效率,这也是 re 模块的最佳实践。