正则表达式(Regular Expression,简称 regex 或 re)是用于匹配、查找、替换字符串中特定模式的强大工具。
在 Python 中,通过内置的 re 模块来使用正则表达式。
1. 核心语法速成
在写 Python 正则之前,你需要了解一些常用的元字符(特殊符号):
\d:匹配数字(0-9)。\w:匹配字母、数字或下划线。\s:匹配任意空白字符(空格、换行符等)。.:匹配除换行符以外的任意字符。*:匹配前面的字符 0 次或多次。+:匹配前面的字符 1 次或多次。?:匹配前面的字符 0 次或 1 次。^:匹配字符串的开头。$:匹配字符串的结尾。[abc]:匹配方括号中的任意一个字符(a 或 b 或 c)。{n}: 精确匹配 n 次{n,}: 匹配 至少 n 次(上不封顶){n,m}: 匹配 n 到 m 次(包含 n 和 m)
2. Python re 模块常用函数
(1) re.findall(pattern, string)
作用: 找出所有符合条件的子串,返回一个列表。
import re
text = "我的电话是10086,他的电话是10010"
# \d+ 表示匹配一个或多个连续的数字
numbers = re.findall(r"\d+", text)
print(numbers) # 输出: ['10086', '10010']
(2) re.search(pattern, string)
作用: 扫描整个字符串,找到第一个匹配项并返回一个“匹配对象”(match object)。找不到返回 None。
text = "Python is 100 points"
match = re.search(r"\d+", text)
if match:
print(f"找到了: {match.group()}") # 输出: 找到了: 100
(3) re.sub(pattern, repl, string)
作用: 替换。将匹配到的部分换成别的字符。
text = "Apple price: $10, Orange price: $5"
# 把所有数字替换为 'HIDDEN'
new_text = re.sub(r"\d+", "HIDDEN", text)
print(new_text) # 输出: Apple price: $HIDDEN, Orange price: $HIDDEN
(4) re.split(pattern, string)
作用: 分割。根据正则匹配项来分割字符串。
text = "apple;banana,orange|grape"
# 按照分号、逗号或竖线分割
result = re.split(r"[;,|]", text)
print(result) # 输出: ['apple', 'banana', 'orange', 'grape']
3. 一个重要的细节:原始字符串 r""
在 Python 中写正则表达式,强烈建议在字符串前面加个 r。
- 原因:正则表达式里经常有反斜杠
\(比如\d)。在普通 Python 字符串里,\是转义符(比如\n是换行)。 - r 的作用:
r代表 Raw String(原始字符串),它会告诉 Python:“不要转义我的反斜杠,把它们原封不动地交给正则引擎”。
4. 综合实战:提取电子邮箱
这是一个稍微复杂一点的例子,展示如何组合使用:
import re
content = "如有疑问请联系 admin@example.com 或者 support_123@work.net"
# 正则解析:
# [\w.-]+ : 匹配字母、数字、下划线、点或横杠一次或多次
# @ : 匹配 @ 符号
# [\w.-]+ : 匹配域名部分
email_pattern = r"[\w.-]+@[\w.-]+"
emails = re.findall(email_pattern, content)
print(f"提取到的邮箱: {emails}")
# 输出: ['admin@example.com', 'support_123@work.net']
总结:什么时候用正则?
- 数据清洗:从杂乱的文本中提取电话、邮箱、日期。
- 格式校验:检查用户输入的密码是否包含数字和字母。
- 复杂替换:比如把文档里所有的日期格式从
2023-01-01改成01/01/2023。
如果只是简单的包含关系(比如 if "apple" in text),直接用 Python 原生字符串操作更高效;只有在处理复杂模式时,才动用正则表达式。