正则表达式不符合预期

时间:2014-10-26 08:32:16

标签: python regex grep

在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 $?

有人可以告诉我为什么吗?

2 个答案:

答案 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个字符。这就是详细情况:

  1. (c+)c
  2. 中的ca相匹配
  3. (c+)*无法与另一个c
  4. 匹配
  5. \1尝试匹配组1的内容(c),然后失败
  6. 正则表达式现在必须回溯。 (c+)*现在只匹配任何内容,而不是c
  7. 再次,\1尝试匹配组1的内容,但组1未成功匹配,因此失败。
  8. 正则表达式尝试再次回溯,但不能 - (c+)*无法匹配任何东西。此时,模式未能匹配。