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。
🧩 拓展练习(动手实践)
- 编写程序提取一段英文文本中的所有单词,并忽略大小写差异。
- 使用
re.VERBOSE编写一个复杂的正则表达式来匹配电话号码(格式多样)。 - 编写函数,提取网页 HTML 文本中所有的
<title>标签内容,支持跨行匹配。 - 编写脚本,将一段日志中所有的时间戳统一转换为标准格式(如
HH:MM:SS)。 - 使用
re.MULTILINE匹配每行以特定前缀开头的日志条目(如ERROR:)。
如果你希望我为你提供:
- 《Python 正则表达式修饰符速查表 PDF》
- 更多实战项目练习题(含解析)
- 视频教学资源推荐(中文讲解)
- 如何结合 PyCharm 快捷键快速测试带标志的正则表达式
欢迎随时告诉我 😊

浙公网安备 33010602011771号