Python3 正则表达式修饰符 - 可选标志

Python3 正则表达式修饰符 - 可选标志(Flags)


🎯 学习目标

掌握 Python 中正则表达式模块 re 的可选标志(Flags),理解每个标志的作用和使用场景。能够在实际开发中根据需求灵活选择修饰符,提高正则表达式的灵活性与匹配能力,并能在 PyCharm 环境下高效调试带标志的正则表达式。


🔑 核心重点

修饰符 缩写 功能说明
re.IGNORECASE I 忽略大小写进行匹配
re.MULTILINE M 多行模式,^ 和 `
---------------- ------ --------------------------------------------
re.IGNORECASE I 忽略大小写进行匹配
匹配每行开头和结尾
re.DOTALL S . 匹配包括换行在内的所有字符
re.VERBOSE X 支持注释和空白,便于阅读长正则
re.ASCII A 仅匹配 ASCII 字符,不支持 Unicode
re.LOCALE L 使用当前区域设置匹配字符(不推荐)
re.UNICODE U 使用 Unicode 匹配(默认)

📚 详细讲解

一、re.IGNORECASE (re.I):忽略大小写匹配

用于在匹配时忽略大小写差异。

✅ 示例:

import re

text = "Hello World"
pattern = re.compile(r'hello', re.IGNORECASE)

if pattern.search(text):
    print("匹配成功!")

📌 输出:

匹配成功!

二、re.MULTILINE (re.M):多行模式

改变 ^$ 的行为,使其分别匹配每一行的开始和结束。

✅ 示例:

text = "Start\nMiddle\nEnd"

# 匹配以 'M' 开头的行
pattern = re.compile(r'^M.*', re.MULTILINE)
print(pattern.findall(text))  # 输出: ['Middle']

三、re.DOTALL (re.S):点号匹配换行符

默认情况下,. 不会匹配换行符。使用此标志后,可以跨行匹配任意字符。

✅ 示例:

text = "abc\ndef"

# 匹配整个文本
pattern = re.compile(r'.*', re.DOTALL)
print(pattern.match(text).group())  # 输出完整字符串,包含换行

四、re.VERBOSE (re.X):增强可读性

允许你在正则表达式中添加空格、换行和注释,便于理解和维护复杂正则。

✅ 示例:

pattern = re.compile(r"""
    \d{3}       # 区号
    [-.\s]?     # 分隔符(可选)
    \d{3}       # 前三位
    [-.\s]?     # 分隔符(可选)
    \d{4}       # 后四位
""", re.VERBOSE)

print(pattern.match("123-456-7890"))  # 成功匹配

五、re.ASCII (re.A):ASCII 模式匹配

限制 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 范围内的字符。

✅ 示例:

text = "你好123世界"

# 仅匹配数字
pattern = re.compile(r'\d+', re.ASCII)
print(pattern.findall(text))  # 输出: ['123']

六、re.LOCALE (re.L):区域相关匹配(已不推荐)

根据当前系统区域设置进行匹配,通常用于处理本地化字符(如重音字母),但因平台依赖性强,现已不推荐使用。


七、re.UNICODE (re.U):Unicode 匹配(默认)

确保正则表达式以 Unicode 方式解析,是 Python 3 的默认行为,一般无需显式指定。


⚠️ 注意事项

  • 多个标志可以组合使用,用按位或 | 连接,例如:re.IGNORECASE | re.MULTILINE
  • 在 PyCharm 中编写正则时,建议开启“Regex”高亮,方便识别语法错误
  • 对于中文等非 ASCII 字符,尽量避免使用 re.ASCII
  • 如果使用 re.VERBOSE,不要在正则中误加多余的空格
  • 在提取 HTML 或 XML 内容时,优先使用 re.DOTALL 避免遗漏内容

🧪 实际案例分析

📌 场景:从一段多行日志中提取所有 IP 地址(IPv4)

日志样例:

User login from 192.168.1.100 at 14:30
Failed attempt from 10.0.0.5
Connection closed from 172.16.254.3

示例代码:

import re

log_text = """
User login from 192.168.1.100 at 14:30
Failed attempt from 10.0.0.5
Connection closed from 172.16.254.3
"""

# 匹配 IPv4 地址
ip_pattern = re.compile(
    r'\b(?:\d{1,3}\.){3}\d{1,3}\b',
    re.MULTILINE
)

ips = ip_pattern.findall(log_text)
print("找到的IP地址:", ips)

📌 输出:

找到的IP地址: ['192.168.1.100', '10.0.0.5', '172.16.254.3']

📌 说明:

  • 使用了 re.MULTILINE 来逐行扫描日志。
  • 正则中使用了非捕获组 (?:...) 提高性能。
  • 使用了 \b 单词边界防止匹配到非法 IP。

🧩 拓展练习(动手实践)

  1. 编写程序提取一段英文文本中的所有单词,并忽略大小写差异。
  2. 使用 re.VERBOSE 编写一个复杂的正则表达式来匹配电话号码(格式多样)。
  3. 编写函数,提取网页 HTML 文本中所有的 <title> 标签内容,支持跨行匹配。
  4. 编写脚本,将一段日志中所有的时间戳统一转换为标准格式(如 HH:MM:SS)。
  5. 使用 re.MULTILINE 匹配每行以特定前缀开头的日志条目(如 ERROR:)。

如果你希望我为你提供:

  • 《Python 正则表达式修饰符速查表 PDF》
  • 更多实战项目练习题(含解析)
  • 视频教学资源推荐(中文讲解)
  • 如何结合 PyCharm 快捷键快速测试带标志的正则表达式

欢迎随时告诉我 😊

posted @ 2025-06-03 08:36  红尘过客2022  阅读(71)  评论(0)    收藏  举报