在 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 |
使用 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("有效邮箱")
使用 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 是第二款括号包裹的子匹配
使用 re.findall 函数从字符串中搜索匹配指定正则表达式的所有子串。
注意,re.findall 和 re.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)
使用 re.sub 函数从字符串中搜索匹配指定正则表达式的子串,然后将其替换为别的文本。
例如将密码替换为 ****** 进行隐藏:
import re
text = "用户名:user 密码:123456"
hidden = re.sub(r'\d{6}', '******', text)
print(hidden)
使用 re.split 函数从字符串中搜索匹配指定正则表达式的子串,然后根据这些子串的位置将字符串进行分割。
例如:
import re
data = "苹果 ,香蕉, 橙子 , 葡萄"
fruits = re.split(r'\s*,\s*', data) # 按逗号分割,允许逗号前后有空格
print(fruits) # 输出: ['苹果', '香蕉', '橙子', '葡萄']
使用 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("有效邮箱")