国际访客建议访问 Primers 编程伙伴 国际版站点 > Python 教程 > 使用 以获得更好的体验。

# Python 正则表达式的使用

在 Python 中通过 re 模块使用正则表达式,下表是其常用的函数:

接口 说明 示例
match 检查字符串是否匹配正则表达式 查看
search 查找字符串中匹配正则表达的第一个子串 查看
findall 查找字符串中匹配正则表达的所有子串 查看
sub 将字符串中匹配正则表达的子串进行替换 查看
split 通过字符串中匹配正则表达的子串分割字符串 查看
compile 编译正则表达式 查看

由于正则表达式本身存在转义语法,因此通常使用 Python 的 原始字符串 编写正则表达式,避免多次转义。

例如:

正则表达式 含义 普通字符串的表示形式 原始字符串的表示形式
\n 匹配一个换行符 '\\n' r'\n'
\\n 匹配文本 '\n' '\\\\n' r'\\n
\r 匹配一个回车符 '\\r' r'\r'
\\r 匹配文本 '\r' '\\\\r' r'\\r
\t 匹配一个制表符 '\\t' r'\t'
\\t 匹配文本 '\t' '\\\\t' r'\\t

# 匹配校验 match

使用 re.match 函数校验字符串是否匹配指定的正则表达式。

例如校验字符串是否是有效的邮箱地址:

运行示例

import re

# 验证电子邮件格式
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if re.match(email_pattern, "[email protected]"):
    print("有效邮箱")

# 文本搜索

# 单项搜索 search

使用 re.search 函数从字符串中搜索匹配指定正则表达式的第一个子串。

re.search 的返回值是一个 Match 对象,可用作为条件判断是否匹配成功。

通过 Match 对象的 group 方法读取匹配到的子串,其中:

  • 0 为匹配的整个子串

  • 1 为第一个括号包裹的子匹配

  • 以此类推。

例如从订单信息中提取订单号和日期:

运行示例

import re

text = "订单号: 12345, 日期: 2023-08-15"
match = re.search(r'订单号: (\d+), 日期: (\d{4}-\d{2}-\d{2})', text)
if match:
    print(0, match.group(0))    # 0 是匹配的整个子串
    print(1, match.group(1))    # 1 是第一个括号包裹的子匹配
    print(2, match.group(2))    # 2 是第二款括号包裹的子匹配

# 搜索全部 findall

使用 re.findall 函数从字符串中搜索匹配指定正则表达式的所有子串。

注意,re.findallre.search 不同:

  • 如果没有使用子匹配,re.findall 的返回值是字符串数组

  • 如果使用了子匹配,re.findall 的返回值是元组的数组,元组中只有子匹配的字符串,如果要包含完整匹配,则需要在正则表达式最外面加一层括号

例如从订单列表中获取所有订单号和日期:

运行示例

import re

text = '''
订单号: 10001, 日期: 2023-08-15
订单号: 10002, 日期: 2023-08-16
订单号: 10003, 日期: 2023-08-17
订单号: 10004, 日期: 2023-08-18
订单号: 10005, 日期: 2023-08-19
'''

matches = re.findall(r'订单号: (\d+), 日期: (\d{4}-\d{2}-\d{2})', text)
for match in matches:
    print(match)

# 文本替换 sub

使用 re.sub 函数从字符串中搜索匹配指定正则表达式的子串,然后将其替换为别的文本。

例如将密码替换为 ****** 进行隐藏:

运行示例

import re

text = "用户名:user 密码:123456"
hidden = re.sub(r'\d{6}', '******', text)
print(hidden)

# 文本分割 split

使用 re.split 函数从字符串中搜索匹配指定正则表达式的子串,然后根据这些子串的位置将字符串进行分割。

例如:

运行示例

import re

data = "苹果 ,香蕉, 橙子 , 葡萄"
fruits = re.split(r'\s*,\s*', data)  # 按逗号分割,允许逗号前后有空格
print(fruits)  # 输出: ['苹果', '香蕉', '橙子', '葡萄']

# 编译正则表达式 compile

使用 re.split 函数编译正则表达式,编译后可以重复使用,效率更高。

例如:

运行示例

import re

# 验证电子邮件格式
email_pattern = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
if email_pattern.match("[email protected]"):
    print("有效邮箱")
本文 更新于: 2025-11-27 09:37:57 创建于: 2025-11-27 09:37:57