1 re库简介
Python 的re库是一个功能强大的正则表达式模块,它允许用户执行各种复杂的字符串匹配和处理任务。
以下是re库的主要功能:
- 搜索:re.search() 用于搜索字符串中第一次出现的模式。
- 匹配:re.match() 从字符串的开始位置匹配模式。
- 查找:re.findall() 返回字符串中所有匹配的子串。
- 分组:使用圆括号定义的分组,可以在搜索结果中单独提取。
- 替换:re.sub() 用于替换字符串中的匹配项。
- 分割:re.split() 根据模式分割字符串。
- 编译:re.compile() 允许将正则表达式编译成模式对象,提高效率。
- 贪婪与非贪婪匹配:通过使用 ? 来使量词变为非贪婪模式,匹配尽可能少的字符。
- 特殊字符:如 . 匹配任意单个字符,* 匹配前面的元素零次或多次等。
- 修饰符:如 re.IGNORECASE 使匹配时忽略大小写,re.MULTILINE 使 ^ 和 $ 匹配每一行的开始和结束。
re库可以解决的问题非常多样,例如:
- 文本验证:验证邮箱、电话号码、IP 地址等是否符合特定格式。
- 数据提取:从日志文件、网页源代码等中提取有用信息。
- 文本清洗:去除文本中的 HTML 标签、特殊字符或不需要的空白。
- 文本转换:将文本从一种格式转换为另一种格式,如驼峰命名转换为下划线命名。
- 自动化脚本:在自动化脚本中使用正则表达式处理文件名、路径等。
- 自然语言处理:在文本分析中识别和处理词性、语法结构等。
- 配置文件解析:解析配置文件中的选项和参数。
2 代码示例
2.1 搜索
搜索字符串中是否包含数字。
import re
if re.search(r'\d+', 'abc123def'):
print('字符串包含数字')
结果如下:
2.2 匹配
匹配字符串是否包含数字开头。
import re
if re.match(r'^\d+', '123abc'):
print('字符串为数字开头')
结果如下:
2.3 查找
import re
matches = re.findall(r'\b\w+', 'hello world')
print(matches) # ['hello', 'world']
结果如下:
2.4 分组
import re
pattern = re.compile(r'(\w+)@(\w+)')
match = pattern.search('user@example.com')
if match:
print(match.group(1), match.group(2))
结果如下:
2.5 替换
import re
new_str = re.sub(r'\b\w+\b', 'word', 'hello world')
print(new_str)
结果如下:
2.6 分割
import re
parts = re.split(r'\W+', 'This is a test string')
print(parts)
结果如下:
2.7 编译
import re
pattern = re.compile(r'\b\w+\b')
matches = pattern.findall('hello world')
print(matches)
结果如下:
2.8 贪婪与非贪婪匹配
import re
# 贪婪匹配
greedy = re.findall(r'.*', 'start middle end')
print(greedy)
# 非贪婪匹配
non_greedy = re.findall(r'.*?', 'start middle end')
print(non_greedy) # ['start', 'middle', 'end']
结果如下:
在使用re库时,以下是一些建议和注意事项:
- 性能优化:对于复杂的正则表达式,使用编译模式 re.compile() 可以提高匹配效率。
- 调试正则表达式:使用在线工具如 regex101.com 来测试和调试正则表达式,确保它们按预期工作。
- 避免复杂的正则表达式:过于复杂的正则表达式可能难以理解和维护,考虑使用其他字符串方法或将正则表达式分解为更简单的部分。
- 转义特殊字符:在正则表达式中,某些字符具有特殊含义,如 . 表示任意字符,如果需要匹配这些字符本身,需要使用反斜杠 \ 进行转义。
- 注意分组的使用:合理使用分组可以提高正则表达式的灵活性,但也要注意不要过度使用,以免造成混淆。
- Unicode 支持:在使用 Unicode 字符串时,确保正则表达式引擎支持 Unicode 字符,可能需要设置 re.UNICODE 修饰符。
- 错误处理:使用 re 库时,应注意处理可能的异常,如 re.error,这通常是由于正则表达式语法错误引起的。
- 安全性:在处理来自不可信源的输入时,使用正则表达式可能会导致拒绝服务攻击(ReDoS)。确保对输入进行适当的限制和验证。
- 保持简洁:尽量使用简洁的正则表达式,避免过度使用复杂的模式,以提高代码的可读性和可维护性。