在处理字符串时,你是否遇到过这些难题:从文本中提取所有邮箱地址、验证手机号格式、批量替换特定字符…… 这些看似复杂的操作,用 Python 的re 工具类(正则表达式模块)就能轻松搞定。它就像一位字符串魔法师,能用简洁的表达式完成复杂的文本处理,今天就来见识下它的魔法招数!

1. 匹配查找:精准定位目标字符串

想从一堆文本中揪出符合规则的内容?re.findall () 就是你的 “寻宝探测器”:

import retext = "联系我们:邮箱python@example.com,电话13812345678,备用邮箱code@test.org"# 提取所有邮箱(规则:xxx@xxx.xxx)
email_pattern = r"\w+@\w+\.\w+"
emails = re.findall(email_pattern, text)
print(emails)  # 输出:['python@example.com', 'code@test.org']# 提取手机号(规则:1开头的11位数字)
phone_pattern = r"1\d{10}"
phones = re.findall(phone_pattern, text)
print(phones)  # 输出:['13812345678']

正则表达式就像一把定制的 “筛子”,能精准过滤出你想要的内容,比手动切割字符串高效 10 倍!

2. 匹配验证:给字符串 “验明正身”

用户输入的手机号、身份证号是否符合格式?re.match () 能当 “格式检查员”:

import redef is_valid_phone(phone):# 手机号规则:1开头,第二位3/4/5/7/8,后面9位数字pattern = r"^1[34578]\d{9}$"return bool(re.match(pattern, phone))print(is_valid_phone("13812345678"))  # 输出:True
print(is_valid_phone("12345678901"))  # 输出:False(第二位不符合)
print(is_valid_phone("1381234567"))   # 输出:False(长度不够)

^和$分别表示字符串的开头和结尾,确保整个字符串都符合规则,避免 “假阳性” 匹配。

3. 替换修改:批量改造字符串

想把文本中的敏感信息打码,或者统一替换特定格式?re.sub () 是 “批量改造大师”:

import retext = "用户A:13812345678,用户B:13987654321"# 手机号中间4位打码
masked_text = re.sub(r"1\d{2}(\d{4})\d{4}", r"1**\1****", text)
print(masked_text)  # 输出:用户A:1**1234****,用户B:1**8765****# 替换日期格式(yyyy-mm-dd 转 mm/dd/yyyy)
date_text = "今天是2025-08-10,昨天是2025-08-09"
new_date_text = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\2/\3/\1", date_text)
print(new_date_text)  # 输出:今天是08/10/2025,昨天是08/09/2025

\1 \2代表正则表达式中括号捕获的内容,就像 “复制粘贴” 特定部分,灵活又高效。

4. 编译表达式:提升重复操作效率

如果需要多次使用同一个正则表达式,re.compile () 能帮你 “预编译”,提升运行速度:

import re# 编译表达式(只做一次)
email_pattern = re.compile(r"\w+@\w+\.\w+")# 多次使用
text1 = "邮箱:dev@python.org"
text2 = "联系:support@example.com"print(email_pattern.findall(text1))  # 输出:['dev@python.org']
print(email_pattern.findall(text2))  # 输出:['support@example.com']

编译后的表达式就像 “预打包” 的工具,调用时不用重复解析,在循环处理大量文本时优势明显。

5. 进阶技巧:贪婪与非贪婪匹配

处理 HTML 标签这类嵌套文本时,需要控制匹配范围:

import rehtml = "<div>内容1</div><div>内容2</div>"# 贪婪匹配(默认,尽可能多匹配)
greedy = re.findall(r"<div>.*</div>", html)
print(greedy)  # 输出:['<div>内容1</div><div>内容2</div>']# 非贪婪匹配(加?,尽可能少匹配)
non_greedy = re.findall(r"<div>.*?</div>", html)
print(non_greedy)  # 输出:['<div>内容1</div>', '<div>内容2</div>']

一个?就能改变匹配策略,轻松应对复杂的嵌套结构。

总结:文本处理的 “瑞士军刀”

re 工具类虽然看起来需要记一些正则符号,但一旦掌握,就像拥有了一把万能的文本处理刀。无论是数据清洗、格式验证,还是内容提取、批量替换,它都能以简洁的代码完成复杂操作。

别被正则表达式的 “神秘感” 吓倒,从简单的匹配开始尝试,你会发现:原来处理字符串可以这么高效!下次遇到文本处理难题,记得请出这位 “字符串魔法师” 哦!