为什么这个正则表达式找到重复的字符失败?

时间:2016-01-31 05:01:51

标签: python regex

我正在尝试构建一个正则表达式来匹配任何两个或多个重复字母数字字符的出现。以下正则表达式失败:

 import re
 s = '__commit__'
 m = re.search(r'([a-zA-Z0-9])\1\1', s)

但是当我改变它时它起作用:

m = re.search(r'([a-zA-A0-9])\1+', s)

我对这就是它的原因感到非常困惑。任何人都可以提供一些见解吗?

2 个答案:

答案 0 :(得分:1)

看看这一行。

 m = re.search(r'([a-zA-Z0-9])\1\1', s)

您正在使用模式和两个反向引用(已匹配模式的引用)。因此,只有当出现最少三个连续字符时才会匹配。你可以这样做:

 m = re.search(r'([a-zA-Z0-9])\1', s)

当出现最少两个连续字符时匹配。

但是,以下一个要好得多。

m = re.search(r'([a-zA-A0-9])\1+', s)

那是因为,现在您尝试匹配至少一个或多个后向引用\1+,即至少两个连续字符。

答案 1 :(得分:1)

onItemClick()是对任何先前匹配的组的反向引用。因此,对您不起作用的原始正则表达式实质上意味着:

匹配包含以前匹配组的3次出现的字母数字字符串。在这种情况下,之前匹配的群组\1包含单个字符([a-zA-Z0-9])a-zA-Z。然后,你的正则表达式中有两个0-9,它对前面匹配的字符有两个反向引用。

在第二个正则表达式中,后引用'\1前面有一个\1,这意味着匹配至少一个出现之前捕获的字符 - 这意味着确认此模式的字符串长度必须至少为2个字符。

希望这有帮助。