美文网首页Python进阶
【Python进阶】2.7最短匹配模式 非贪婪

【Python进阶】2.7最短匹配模式 非贪婪

作者: Julia语言 | 来源:发表于2018-11-22 10:29 被阅读11次

2.7 最短匹配模式


问题

你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。
而你想修改它变成查找最短的可能匹配。


解决方案

这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字符串)。
为了说明清楚,考虑如下的例子:

>>> str_pat = re.compile(r'"(.*)"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>

在这个例子中,模式 r'\"(.*)\"' 的意图是匹配被双引号包含的文本。
但是在正则表达式中*操作符是贪婪的,因此匹配操作会查找最长的可能匹配。
于是在第二个例子中搜索 text2 的时候返回结果并不是我们想要的。

为了修正这个问题,可以在模式中的*操作符后面加上?修饰符,就像这样:

>>> str_pat = re.compile(r'"(.*?)"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>

这样就使得匹配变成非贪婪模式,从而得到最短的匹配,也就是我们想要的结果。


讨论

这一节展示了在写包含点(.)字符的正则表达式的时候遇到的一些常见问题。
在一个模式字符串中,点(.)匹配除了换行外的任何字符。
然而,如果你将点(.)号放在开始与结束符(比如引号)之间的时候,那么匹配操作会查找符合模式的最长可能匹配。
这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。
通过在 * 或者 + 这样的操作符后面添加一个 ? 可以强制匹配算法改成寻找最短的可能匹配。

欢迎关注微信公众账号Julia语言.jpg

点击阅读原文可查看历史文章

相关文章

  • 【Python进阶】2.7最短匹配模式 非贪婪

    2.7 最短匹配模式 问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。而你想修改它...

  • 039 Python语法之正则表达式

    正则的基本语法 贪婪与非贪婪模式 Python中的数量词默认是贪婪模式的,总是默认尝试匹配更多的字符,非贪婪模式则...

  • 进阶篇:贪婪模式 (9-2)

    饥人谷学习进阶第 9 天 贪婪模式与非贪婪模式 量词在默认下是尽可能多的匹配的,也就是所谓的贪婪模式 举例: 运行...

  • javascript正则表达式

    什么是贪婪模式和非贪婪模式? 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功...

  • 正则表达式的贪婪模式和非贪婪模式

    一、什么是贪婪模式和非贪婪模式? 定义 贪婪模式:正则表达式趋向于匹配最大长度。 非贪婪模式:正则表达式趋向于匹配...

  • 非贪婪模式(?) --实现最短匹配的正则

    问题引入: 问题:在这个例子中,模式r'"(.)"'尝试去匹配包含在引号中文本。但是,操作符在正则表达式中采用的是...

  • 正则表达式

    1.什么是贪婪模式和非贪婪模式? 贪婪模式 一般情况下,正则表达式在匹配过程中会尽可能多的匹配 非贪婪模式 让正则...

  • JavaScript 正则表达式( 匹配网页的图片地址)

    正则表达式 - 元字符 贪婪模式与非贪婪模式 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为;贪婪模式 在...

  • JS正则

    一、什么是贪婪模式和非贪婪模式? 贪婪模式:就是量词在默认情况下尽可能的多匹配。例如: 非贪婪模式:就是尽可能少的...

  • 6. 正向预查、贪婪与非贪婪

    正向预查 x(?=y) 匹配x后跟着y的字符串,这种向后匹配的方式叫做正向预查。 贪婪模式&非贪婪模式 贪婪模式应...

网友评论

    本文标题:【Python进阶】2.7最短匹配模式 非贪婪

    本文链接:https://www.haomeiwen.com/subject/autgfqtx.html