在python 2.7.5中,
r = re.search(r'((a+)\2b)*\1', 'abaabaab')
会导致r.group(0)
为'aabaab'
,但我希望它与'abaabaab'
开头的空字符串匹配。
我认为它不遵循第一场比赛规则。
我希望
r = re.search(r'(c+)*\1', 'ca')
与'c'
匹配,其中第一组捕获'c'
并重复零时间,因此'\1'
匹配'c'
。我在python下得到的是'NoneType'
,osx grep返回1。
echo c | grep -E '(c+)*\1' ; echo $?
。
有人可以告诉我为什么吗?
答案 0 :(得分:1)
所以,让我们来看看
r = re.search(r'((a+)\2b)*\1', 'abaabaab')
您正在寻找一个或多个' a'接着是相同数量的'然后是一个'' a' aab'然后' aab'再次。所以结果是完全清楚的:至少有两个' a'和偶数个' a,所以第一个' ab'无法比拟。
r = re.search(r'(c+)*\1', 'ca')
查找任何数量的' c'然后是相同数量的'。但是只有一个' c,所以没有匹配。 ' *'允许零匹配,也就是说,该组不存在,并且不能使用\ 1引用不存在的组。看看:
>>> re.search(r'(c+)*(b+)*(a+)*', 'ca').groups()
('c', None, 'a')
你看,第二组不是空的,它不存在。
答案 1 :(得分:0)
r = re.search(r'((a+)\2b)*\1', 'abaabaab'
匹配aabaab
,因为您正在使用re.search
(搜索输入字符串进行匹配)而不是re.match
(其中尝试匹配输入字符串的模式。
>>> print re.match(r'((a+)\2b)*\1', 'abaabaab')
None
r = re.search(r'(c+)*\1', 'ca')
不返回匹配项,因为它应匹配偶数个c
个字符。这就是详细情况:
(c+)
与c
ca
相匹配
(c+)*
无法与另一个c
\1
尝试匹配组1的内容(c
),然后失败(c+)*
现在只匹配任何内容,而不是c
。\1
尝试匹配组1的内容,但组1未成功匹配,因此失败。(c+)*
无法匹配任何东西。此时,模式未能匹配。