Python实用技法第26篇:定义实现最短匹配的正则表达式

上一篇文章: Python实用技法第25篇:正则:以不区分大小写的方式对文本作查找和替换
下一篇文章: Python实用技法第27篇:编写多行模式的正则表达式

一、需求🙀

咱们正在尝试用正则表达式对文本模式作匹配,但识别出来的是最长的可能匹配。相反,咱们想将其修改成最短的可能匹配。

二、解决方案😸

这个问题一般会在匹配的文本被一对开始和结束的分隔符包起来的时候出现(例如带引号的字符串),为了说明这个问题,请看下面实例:正则表达式

import re

str_pat=re.compile(r'\"(.*)\"')
text1='mark say "love"'
text2='mark say "love",jingjing say "yes"'
print(str_pat.findall(text1))
print(str_pat.findall(text2))

结果:segmentfault

['love']
['love",jingjing say "yes']

在这个例子中,模式r'"(.*)"'尝试去匹配包含在引号中的文本。可是,*操做符在正则表达式中采用的是贪心策略,因此匹配过程是基于找出最长的可能匹配来进行的。因此上面才会出现【love",jingjing say "yes】这个匹配结果。code

要解决这个问题,只要在模式中的*操做符后面加上?修饰符就能够了。字符串

示例:get

import re

str_pat=re.compile(r'\"(.*?)\"')
text1='mark say "love"'
text2='mark say "love",jingjing say "yes"'
print(str_pat.findall(text1))
print(str_pat.findall(text2))

结果:import

['love']
['love', 'yes']

这么作使得匹配过程不会以贪心方式进行,也就会产生最短的匹配了。im

三、分析😈

本节提到了一个当编写还有句点【.】字符的正则表达式常会遇到的问题。为了解决最长匹配问题,让匹配变为最短匹配,须要在*或+后加上一个【?】。解决方案

上一篇文章: Python实用技法第25篇:正则:以不区分大小写的方式对文本作查找和替换
下一篇文章: Python实用技法第27篇:编写多行模式的正则表达式
相关文章
相关标签/搜索