2.20 正则表达式
2.20.1 re模块的使用
2.20.1.1 模块概述
Python的re模块提供了对正则表达式的支持,允许复杂的字符串匹配和操作。
2.20.1.2 re.match():从字符串的开始位置匹配
import re
result = re.match(r'^\d+', '123abc')
if result:
print(result.group())
else:
print("No match")
输出:
123
2.20.1.3 re.search():搜索整个字符串
result = re.search(r'\d+', 'abc123def')
if result:
print(result.group())
else:
print("No match")
输出:
123
2.20.1.4 re.findall():查找所有匹配项
results = re.findall(r'\d+', 'abc123def456')
print(results)
输出:
['123', '456']
2.20.1.5 re.finditer():查找所有匹配项并返回迭代器
results = re.finditer(r'\d+', 'abc123def456')
for match in results:
print(match.group())
输出:
123
456
2.20.1.6 re.sub():替换匹配的文本
result = re.sub(r'\d+', 'NUM', 'abc123def456')
print(result)
输出:
abcNUMdefNUM
2.20.1.7 re.split():按照正则表达式分割字符串
results = re.split(r'\s+', 'abc 123 def 456')
print(results)
输出:
['abc', '123', 'def', '456']
2.20.1.8 re.compile():编译正则表达式,提高效率
pattern = re.compile(r'\d+')
result = pattern.search('abc123def')
if result:
print(result.group())
else:
print("No match")
输出:
123
2.20.2 常用正则表达式模式
2.20.2.1 元字符与特殊字符
# 匹配任意字符
result = re.search(r'.', 'abc')
print(result.group())
# 匹配字符串的开始
result = re.match(r'^a', 'abc')
print(result.group())
# 匹配字符串的结束
result = re.search(r'c$', 'abc')
print(result.group())
# 匹配单词边界
result = re.search(r'\b\w+\b', 'abc')
print(result.group())
2.20.2.2 字符集与范围
# 匹配a、b、c中的任意字符
result = re.search(r'[abc]', 'abcd')
print(result.group())
# 匹配除a、b、c之外的任何字符
result = re.search(r'[^abc]', 'abcd')
print(result.group())
# 匹配所有小写字母
result = re.search(r'[a-z]', 'abcd')
print(result.group())
2.20.2.3 数量词
# 匹配零次或多次
result = re.search(r'a*', 'aaa')
print(result.group())
# 匹配一次或多次
result = re.search(r'a+', 'aaa')
print(result.group())
# 匹配零次或一次
result = re.search(r'a?', 'aaa')
print(result.group())
2.20.2.4 分组与捕获
# 分组匹配
result = re.search(r'(\d+)-(\d+)', '123-456')
if result:
print(result.group(1), result.group(2))
# 引用分组
result = re.search(r'(\d+)-\1', '123-123')
if result:
print(result.group(1))
2.20.2.5 非捕获组与命名组
# 非捕获分组
result = re.search(r'(?:\d+)-(\d+)', '123-456')
if result:
print(result.group(1))
# 命名分组
result = re.search(r'(?P<first>\d+)-(?P<second>\d+)', '123-456')
if result:
print(result.group('first'), result.group('second'))
2.20.2.6 断言
# 正向前瞻
result = re.search(r'123(?=456)', '123456')
print(result.group())
# 负向前瞻
result = re.search(r'123(?!456)', '123789')
print(result.group())
# 正向后顾
result = re.search(r'(?<=123)456', '123456')
print(result.group())
# 负向后顾
result = re.search(r'(?<!123)456', '789456')
print(result.group())
2.20.3 正则表达式的匹配与替换
2.20.3.1 匹配字符串
# 使用re.match()匹配字符串的开始
result = re.match(r'^\d+', '123abc')
if result:
print(result.group())
# 使用re.search()在整个字符串中查找匹配
result = re.search(r'\d+', 'abc123def')
if result:
print(result.group())
# 使用re.findall()获取所有匹配项
results = re.findall(r'\d+', 'abc123def456')
print(results)
# 使用re.finditer()获取所有匹配的迭代器
results = re.finditer(r'\d+', 'abc123def456')
for match in results:
print(match.group())
2.20.3.2 替换匹配项
# 使用re.sub()进行文本替换
result = re.sub(r'\d+', 'NUM', 'abc123def456')
print(result)
# 使用反向引用进行替换
result = re.sub(r'(\d+)-(\d+)', r'\2-\1', '123-456')
print(result)
# 使用函数作为替换文本
def replace_func(match):
if match.group(0) == 'a':
return 'x'
else:
return 'y'
result = re.sub(r'a|b', replace_func, 'abcab')
print(result)
2.20.3.3 正则表达式的性能优化
# 编译正则表达式
pattern = re.compile(r'\d+')
result = pattern.search('abc123def')
if result:
print(result.group())
# 使用非贪婪匹配
result = re.search(r'.*?', 'abc123def')
print(result.group())
# 限制匹配次数
result = re.search(r'a{3}', 'aaabbb')
print(result.group())
2.20.3.4 常见应用场景
# 匹配电话号码
result = re.search(r'\d{3}-\d{3}-\d{4}', '123-456-7890')
if result:
print(result.group())
# 提取HTML或XML标签内容
result = re.search(r'<title>(.*?)</title>', '<title>Example</title>')
if result:
print(result.group(1))
# 验证输入数据(例如密码、用户名、日期等)
import re
pattern = re.compile(r'^[a-zA-Z0-9_]{8,16}$')
if pattern.match('password123'):
print("Valid password")
else:
print("Invalid password")
2.20.3.5 正则表达式在线工具与调试
正则表达式在线工具可以帮助你快速测试和调试正则表达式。以下是一些常用的在线工具和调试技巧:
2.20.3.5.1 常用的正则表达式在线工具
-
Regex101:支持多种语言(如 Python、JavaScript、PHP 等),提供即时匹配结果和详细的正则表达式解释。
- 网址:regex101.com/
- 特性:实时匹配、高亮显示、正则解释、测试用例管理、支持多种语言、调试和性能分析。
-
RegExr:一个直观的正则表达式在线工具,支持学习和创建正则表达式,带有示例和模式库。
-
网址:regexr.com/
-
特性:互动界面、正则表达式模式库、实时匹配、高亮和解释功能、代码
-
生成。
-
RegexPal:一个简单的正则表达式测试工具,支持JavaScript语法,适用于快速调试。
- 网址:www.regexpal.com/
- 特性:简单界面、支持JavaScript的正则表达式、实时匹配。
-
RegExp Testing Tool:一个专业的正则表达式调试工具,支持高级正则表达式测试和分析。
- 网址:www.regexpal.com/
- 特性:支持多种正则表达式调试、实时分析、文本测试。
-
RegexPlanet:一个支持多种语言的在线正则表达式测试工具,提供Python、Java、JavaScript等语言的兼容模式。
- 网址:www.regexplanet.com/
- 特性:支持多个编程语言,实时匹配、详细的正则表达式语法支持。
2.20.3.5.2 在线工具的使用技巧
- 实时匹配与即时反馈:在线工具通常提供实时的匹配结果,你可以输入测试字符串和正则表达式,观察匹配结果的变化。
- 正则表达式解释:大部分工具提供了正则表达式的详细解释,帮助你理解每个模式的作用,特别适合初学者。
- 代码生成与导出:工具如 Regex101 提供了生成 Python、JavaScript 等语言代码的功能,可以直接将测试好的正则表达式嵌入到你的程序中。
- 性能优化测试:一些高级工具(如 Regex101)提供性能分析,帮助你了解不同正则表达式的性能表现,尤其是在大型数据集上的表现。
2.20.3.5.3 调试技巧
- 测试多种输入:在线工具允许你同时测试多个输入,帮助验证正则表达式的准确性和健壮性。
- 分步调试:可以分阶段测试正则表达式的每个部分,查看其如何作用于输入数据,便于找到问题所在。
- 使用标记和分组:使用分组和命名组可以帮助清晰地提取匹配结果,并且一些工具提供了分组高亮显示的功能。
- 检查正则的执行顺序:在某些工具中,你可以查看正则表达式的执行步骤,了解它是如何逐步匹配输入字符串的。
这些代码示例提供了
re模块的使用,常用正则表达式模式,以及正则表达式的匹配与替换的详细说明。您可以在本地环境中执行这些代码来验证输出。 -
-