一个很简单的正则问题,没搞明白

2017 年 12 月 29 日
 geekyoung
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
    print "matchObj.group() : ", matchObj.group()
    print "matchObj.group(1) : ", matchObj.group(1)
    print "matchObj.group(2) : ", matchObj.group(2)
else:
    print "No match!!"

这来自菜鸟上的教程,自己正则上也一直类似这么写的。 但今天突然想到一个问题,刚开始使用(.*)来匹配的话,岂不是直接可以匹配到最后了, .* 代表匹配除换行符之外的所有字符, 那 are (.*?) .* 这块怎么匹配呢?实在无解。

4008 次点击
所在节点    程序员
29 条回复
geekyoung
2017 年 12 月 29 日
比如说刚开始 . 开始匹配 C 然后 a t s 空格 a r........直接给一口气到最后了,怎么去检测 are 这个模式呢?是不是检测到头,然后再转回头找,唉 乱了乱了
OscarUsingChen
2017 年 12 月 29 日
nazor
2017 年 12 月 29 日
编译原理上有讲这个,有限自动机那章。
skydiver
2017 年 12 月 29 日
写错了呗,没有这么写的
boboliu
2017 年 12 月 29 日
带?的是 lazy 模式,不带问号是 greedy。

lazy 是能匹配多少匹配多少,greedy 是能匹配多少匹配多少,懂了么?(滑稽



P.S. 建议看楼上发的文档
boboliu
2017 年 12 月 29 日
@boboliu 等等被楼上带飞了。。。这个*也是有界限的,就是到下一个关键字能够匹配为止。
OscarUsingChen
2017 年 12 月 29 日
@boboliu 建议友善一点,谁都有不懂的时候
boboliu
2017 年 12 月 29 日
@OscarUsingChen 额。。。在下自认为。。。似乎没有不友善的地方?
tanszhe
2017 年 12 月 29 日
这个就不应该用正则表达式 直接用 are 切分 去后面的那个单词 肯定比 正则表达式 高效多了
boboliu
2017 年 12 月 29 日
@tanszhe 直接用 are 切分之后对着后面再上一个空格切分?感觉那还不如正则优雅吧?
cnt2ex
2017 年 12 月 29 日
匹配失败了就回溯
benyuanzhang
2017 年 12 月 29 日
@boboliu 大概说的是断句吧
再一次感叹汉语博大精深
ffkjjj
2017 年 12 月 30 日
(.*?)后面有个空格。
imn1
2017 年 12 月 30 日
第二个括号中的问号很重要,基本确定了是 are 后两个空格间的内容,其他就很容易推导了
azh7138m
2017 年 12 月 30 日
http://deerchao.net/tutorials/regex/regex.htm#greedyandlazy

最先开始的匹配拥有最高的优先权

这个 30 分钟入门其实写的不错(
geekyoung
2017 年 12 月 30 日
@OscarUsingChen 刚才看了,谢谢。但是请问,在这个问题情景下,那么第一个是贪婪匹配,那这个 are 是回溯过来找的?还是正则表达式在匹配的过程中一直在发现 are ?
geekyoung
2017 年 12 月 30 日
@skydiver 不是错的,可以成功匹配
geekyoung
2017 年 12 月 30 日
@boboliu 谢谢!以前喜欢一个人,现在喜欢一个人
geekyoung
2017 年 12 月 30 日
@boboliu 就是到下一个关键字能够匹配为止。 那这个下一个关键字是在找的过程中一直去“发现的”,还是走到结束后再回过头来找的?既然是贪婪匹配。
geekyoung
2017 年 12 月 30 日
@tanszhe 只匹配 Cats 和 smarter

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/418728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX