python 正则表达式

41 阅读2分钟

正则表达式(Regular Expression,简称 regexre)是用于匹配、查找、替换字符串中特定模式的强大工具。

在 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']

总结:什么时候用正则?

  1. 数据清洗:从杂乱的文本中提取电话、邮箱、日期。
  2. 格式校验:检查用户输入的密码是否包含数字和字母。
  3. 复杂替换:比如把文档里所有的日期格式从 2023-01-01 改成 01/01/2023

如果只是简单的包含关系(比如 if "apple" in text),直接用 Python 原生字符串操作更高效;只有在处理复杂模式时,才动用正则表达式。