使用正则表达式

时间:2016-10-26 12:12:39

标签: python regex

我希望使用正则表达式匹配“三个大写字母,一个小写字母和三个大写字母”。使这很困难的是相邻的大写字母必须相同。例如,我希望AAAbCCC,而不是AAAbCCDABAbCDC

这是我尝试过的:

print(re.findall("[A-Z]{3}[a-z][A-Z]{3}", l))

但是,这不是我想要的,因为它也匹配AAAbCCDABAbCDC

3 个答案:

答案 0 :(得分:3)

利用捕获的分组:

^([A-Z])\1\1[a-z]([A-Z])\2\2$

Demo

  • ^([A-Z])捕获第一个大写字母,并放入捕获的第1组,\1\1匹配接下来的两个字符(如果它们与捕获的字符相同)。同样适用于第二个捕获的,后来由\2
  • 引用

您可以使用范围匹配{}

^([A-Z])\1{2}[a-z]([A-Z])\2{2}$

答案 1 :(得分:3)

您可以使用([A-Z])\1{2}[a-z]([A-Z])\2{2}

它将第一个找到的upercase字符存储在一个组中,并将其与\1(以及\2)一起重复使用,以检查以下两个字符。

答案 2 :(得分:2)

您可以使用捕获组和反向引用:

re.findall(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", string)

但请注意,在模式re.findall()中存在组时,将返回组而不是匹配。 因此,要获得匹配的字符串,您需要将整个模式括在括号中并取第一组:

>>> s = "AAAbCCC AAAbCCD"
>>> [groups[0] for groups in re.findall(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", s)]
['AAAbCCC']

你也可以使用re.finditer(),它会在匹配对象上返回一个迭代器:

>>> [match.group(1) for match in re.finditer(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", s)]
['AAAbCCC']