
#!/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 (.*?) .* 这块怎么匹配呢?实在无解。
1 geekyoung OP 比如说刚开始 . 开始匹配 C 然后 a t s 空格 a r........直接给一口气到最后了,怎么去检测 are 这个模式呢?是不是检测到头,然后再转回头找,唉 乱了乱了 |
2 OscarUsingChen 2017-12-29 21:42:43 +08:00 via iPhone https://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy regex 有 greedy 和 lazy 之分 |
3 nazor 2017-12-29 21:47:45 +08:00 via iPhone 编译原理上有讲这个,有限自动机那章。 |
4 skydiver 2017-12-29 22:16:15 +08:00 via Android 写错了呗,没有这么写的 |
5 boboliu 2017-12-29 22:28:28 +08:00 带?的是 lazy 模式,不带问号是 greedy。 lazy 是能匹配多少匹配多少,greedy 是能匹配多少匹配多少,懂了么?(滑稽 P.S. 建议看楼上发的文档 |
7 OscarUsingChen 2017-12-29 22:37:47 +08:00 via iPad @boboliu 建议友善一点,谁都有不懂的时候 |
8 boboliu 2017-12-29 22:42:27 +08:00 @OscarUsingChen 额。。。在下自认为。。。似乎没有不友善的地方? |
9 tanszhe 2017-12-29 22:43:26 +08:00 这个就不应该用正则表达式 直接用 are 切分 去后面的那个单词 肯定比 正则表达式 高效多了 |
11 cnt2ex 2017-12-29 22:49:28 +08:00 匹配失败了就回溯 |
12 benyuanzhang 2017-12-29 23:51:52 +08:00 via Android @boboliu 大概说的是断句吧 再一次感叹汉语博大精深 |
13 ffkjjj 2017-12-30 01:48:29 +08:00 via iPhone (.*?)后面有个空格。 |
14 imn1 2017-12-30 01:52:21 +08:00 第二个括号中的问号很重要,基本确定了是 are 后两个空格间的内容,其他就很容易推导了 |
15 azh7138m 2017-12-30 15:09:50 +08:00 |
16 geekyoung OP @OscarUsingChen 刚才看了,谢谢。但是请问,在这个问题情景下,那么第一个是贪婪匹配,那这个 are 是回溯过来找的?还是正则表达式在匹配的过程中一直在发现 are ? |
19 geekyoung OP @boboliu 就是到下一个关键字能够匹配为止。 那这个下一个关键字是在找的过程中一直去“发现的”,还是走到结束后再回过头来找的?既然是贪婪匹配。 |
21 geekyoung OP @< href="/member/cnt2ex">cnt2ex 哦哦 |
25 OscarUsingChen 2017-12-30 23:43:39 +08:00 via iPad @geekyoung 如果第一项匹配了整个 string,那么这个 Regex 算是匹配失败,因为后面的一堆 regex 东西没法匹配到东西 |