Python正则表达式非贪婪与多行匹配详解
本文详解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编程实践有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









