#!/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 2
|
16
geekyoung OP @OscarUsingChen 刚才看了,谢谢。但是请问,在这个问题情景下,那么第一个是贪婪匹配,那这个 are 是回溯过来找的?还是正则表达式在匹配的过程中一直在发现 are ?
|
19
geekyoung OP @boboliu 就是到下一个关键字能够匹配为止。 那这个下一个关键字是在找的过程中一直去“发现的”,还是走到结束后再回过头来找的?既然是贪婪匹配。
|
25
OscarUsingChen 2017-12-30 23:43:39 +08:00 via iPad
@geekyoung 如果第一项匹配了整个 string,那么这个 Regex 算是匹配失败,因为后面的一堆 regex 东西没法匹配到东西
|