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

2017-12-29 21:25:00 +08:00
 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 (.*?) .* 这块怎么匹配呢?实在无解。

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

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



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

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

这个 30 分钟入门其实写的不错(
geekyoung
2017-12-30 21:51:17 +08:00
@OscarUsingChen 刚才看了,谢谢。但是请问,在这个问题情景下,那么第一个是贪婪匹配,那这个 are 是回溯过来找的?还是正则表达式在匹配的过程中一直在发现 are ?
geekyoung
2017-12-30 21:51:41 +08:00
@skydiver 不是错的,可以成功匹配
geekyoung
2017-12-30 21:52:21 +08:00
@boboliu 谢谢!以前喜欢一个人,现在喜欢一个人
geekyoung
2017-12-30 21:53:57 +08:00
@boboliu 就是到下一个关键字能够匹配为止。 那这个下一个关键字是在找的过程中一直去“发现的”,还是走到结束后再回过头来找的?既然是贪婪匹配。
geekyoung
2017-12-30 21:55:06 +08:00
@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