Python正则表达式非贪婪与多行匹配详解

林舟
林舟
发布时间:2026-10-13 | 3人浏览过
原创

本文详解Python中正则表达式的非贪婪匹配机制及多行处理技巧。通过对比贪婪与非贪婪模式的匹配结果,解析当存在前后限定条件时非贪婪标志的失效情况。同时深入讲解re.S与re.M标志对点号及行首尾锚点的影响,帮助开发者精准控制正则匹配行为。

本文通过具体实例,深入解析Python中正则表达式的非贪婪匹配与多行匹配功能,旨在为读者提供实用的参考指南。

以下是关于正则表达式的一些关键技巧总结:

1. 非贪婪匹配标志的使用

>>> re.findall(r"a(\d+?)","a23b") # 非贪婪模式
    ['2']
>>> re.findall(r"a(\d+)","a23b")
    ['23']

需要特别注意以下场景中的匹配差异:

>>> re.findall(r"a(\d+)b","a23b")
    ['23']
>>> re.findall(r"a(\d+?)b","a23b") #如果前后均有限定条件,则非匹配模式失效
    ['23']

2. 实现多行匹配需添加re.S和re.M标志

re.S:启用此标志后,点号(.)将匹配包括换行符在内的所有字符;默认情况下,点号不匹配换行符。

>>> re.findall(r"a(\d+)b.+a(\d+)b","a23b\na34b")
    []
>>> re.findall(r"a(\d+)b.+a(\d+)b","a23b\na34b",re.S)
    [('23','34')]
>>>

re.M:启用此标志后,行首(^)和行尾($)锚点将分别匹配每一行的开始和结束;默认情况下,^仅匹配字符串第一行的开头,$仅匹配字符串最后一行的结尾。

>>> re.findall(r"^a(\d+)b","a23b\na34b")
    ['23']
>>> re.findall(r"^a(\d+)b","a23b\na34b",re.M)
    ['23','34']

然而,若正则表达式中未使用^锚点:

>>> re.findall(r"a(\d+)b","a23b\na34b")
    ['23','43']

由此可见,在不涉及行首锚点的情况下,无需使用re.M标志即可匹配多行内容。

import re
n='''12 drummers drumming,
11 pipers piping, 10 lords a-leaping'''
p=re.compile('^\d+')
p_multi=re.compile('^\d+',re.MULTILINE) #设置 MULTILINE 标志
print re.findall(p,n) #['12']
print re.findall(p_multi,n) # ['12', '11']

import re
a = 'a23b'
print re.findall('a(\d+?)',a) #['2']
print re.findall('a(\d+)',a) #['23']
print re.findall(r'a(\d+)b',a) #['23']
print re.findall(r'a(\d+?)b',a) # ['23']

b='a23b\na34b'
''' . 匹配非换行符的任意一个字符'''
print re.findall(r'a(\d+)b.+a(\d+)b',b) #[]
print re.findall(r'a(\d+)b',b,re.M) # ['23', '34']
print re.findall(r'^a(\d+)b',b,re.M) # ['23', '34']
print re.findall(r'a(\d+)b',b) #['23','34'] 可以匹配多行
print re.findall(r'^a(\d+)b',b) # ['23'] 默认^只会匹配符合正则的第一行
print re.findall(r'a(\d+)b$',b) # ['34'] 默认$只会匹配符合正则的末行
print re.findall(r'a(\d+)b',b,re.M) #['23', '34']
print re.findall(r'a(\d+)b.?',b,re.M) # ['23', '34'] 表达式中的'.'匹配除换行符以外的字符,'?'匹配前一个字符0次或1次
print re.findall(r"a(\d+)b", "a23b\na34b") # ['23', '34']

注:在Python3.4及以上版本中,print已改为函数调用,使用时必须添加括号。

此外,推荐以下两款便捷的正则表达式在线工具供参考使用:

JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

如需了解更多Python相关知识,可查阅本站系列专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。

希望本文的阐述能对您的Python编程实践有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表