美文网首页
Python3 - 最短匹配模式

Python3 - 最短匹配模式

作者: 惑也 | 来源:发表于2018-12-18 22:53 被阅读17次

问题

使用正则表达式匹配字符串时,返回的是最长匹配,需要修改它变成查找最短的匹配。

解决方案

这个问题,一般出现在需要匹配一对分隔符之间的文本时,比如:

import re

text1 = 'Computer says "no."'
text2 = 'Computer says "no." Phone says "yes."'

str_pat = re.compile(r'".*"')
print(str_pat.findall(text1))
print(str_pat.findall(text2))

['"no."']
['"no." Phone says "yes."']

在例子(2)中,需求是匹配被双引号包含的文本,但是在正则表达式中*操作符是贪婪的,匹配操作会查找最长的可能匹配,返回的结果并不是我们想要的。

为了修正这个问题,可以在*操作符后面加上?修饰符,比如:

str_pat1 = re.compile(r'".*?"')
print(str_pat1.findall(text2))

['"no."', '"yes."']

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

讨论

在正则表达式中,点(.)字符匹配除了换行外的任何字符。

如果将点(.)放在开始与结束符(比如引号)之间,匹配操作会查找符合模式的最长可能匹配,会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。

相关文章

  • Python3 - 最短匹配模式

    问题 使用正则表达式匹配字符串时,返回的是最长匹配,需要修改它变成查找最短的匹配。 解决方案 这个问题,一般出现在...

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

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

  • Python3 - 多行匹配模式

    问题 使用正则表达式匹配一大块文本时,需要跨多行去匹配。 解决方案 当用点(.)去匹配任意字符的时候,容易忘记点(...

  • Python学习路线:定义实现最短匹配的正则表达式

    Python学习路线:定义实现最短匹配的正则表达式 1、需求 我们正在尝试用正则表达式对文本模式做匹配,但识别出来...

  • 模式匹配

    模式匹配之字符串 模式匹配之匹配类型 模式匹配之匹配数组、元组、集合 模式匹配之样例类 模式匹配之偏函数

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

    1、需求 我们正在尝试用正则表达式对文本模式做匹配,但识别出来的是最长的可能匹配。相反,我们想将其修改为最短的可能...

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

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

  • 1.shell变量替换

    1.${变量#匹配规则} 从头开始,最短匹配 2.${变量##匹配规则} 从头开始,最长匹配 3.${变量%匹...

  • Python高级第六天

    正则表达式(模式匹配) 一、标准库模块re Python3中使用re模块支持正则表达式(Regular Expre...

  • shell变量替换总结

    1: ${变量#匹配规则} 从头开始匹配,最短删除 输出结果 e you, do you love me ...

网友评论

      本文标题:Python3 - 最短匹配模式

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