继续介绍 Python 的 re 模块及其更多的特性和高级用法:
高级匹配选项
- re.fullmatch(pattern, string, flags=0): 如果整个字符串匹配正则表达式,返回一个匹配对象,否则返回
None。 - re.escape(pattern): 对字符串中所有可能被视为正则表达式运算符的字符进行转义。
- re.purge(): 清除正则表达式缓存。
使用组和分组
在正则表达式中,可以使用括号 () 创建组。这些组可以在匹配对象中通过索引或名称来访问。
pattern = re.compile(r'(\w+)@(\w+)\.(\w+)')
match = pattern.search('hello@example.com')
print(match.group()) # 输出整个匹配的字符串
print(match.group(1)) # 输出第一个分组('hello')
print(match.groups()) # 输出所有分组的元组(('hello', 'example', 'com'))
命名组
使用命名组可以让正则表达式更易读。
pattern = re.compile(r'(?P<username>\w+)@(?P<domain>\w+)\.(?P<tld>\w+)')
match = pattern.search('hello@example.com')
print(match.group('username')) # 输出 'hello'
零宽断言
- 正向先行断言:
(?=...),断言此位置的后面能匹配表达式。 - 负向先行断言:
(?!...),断言此位置的后面不能匹配表达式。 - 正向后行断言:
(?<=...),断言此位置的前面能匹配表达式。 - 负向后行断言:
(?<!...),断言此位置的前面不能匹配表达式。
示例:使用零宽断言
提取后缀为 .com 的电子邮件地址:
emails = "user1@example.com, user2@example.org"
pattern = re.compile(r'[\w\.-]+@[\w\.-]+(?<=\.com)')
print(pattern.findall(emails)) # 输出: ['user1@example.com']
编译标志的使用
使用编译标志可以改变正则表达式的行为:
# 忽略大小写的搜索
pattern = re.compile(r'hello', re.IGNORECASE)
print(pattern.search('Hello, world!')) # 匹配成功
注意事项
- 正则表达式的性能:在某些情况下,正则表达式可能比其他字符串处理方法更慢,特别是在复杂的模式匹配中。
- 安全性问题:在处理用户输入的正则表达式时要特别小心,以避免潜在的安全隐患,如正则表达式注入。
通过以上特性和示例,可以看出 re 模块是 Python 中一个非常强大且灵活的工具,适用于各种复杂的字符串处理和文本分析任务。