#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.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)
#文本替换 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("有效邮箱")