2.20_正则表达式

131 阅读4分钟

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模块的使用,常用正则表达式模式,以及正则表达式的匹配与替换的详细说明。您可以在本地环境中执行这些代码来验证输出。

4-1-2.png