我希望使用正则表达式匹配“三个大写字母,一个小写字母和三个大写字母”。使这很困难的是相邻的大写字母必须相同。例如,我希望AAAbCCC
,而不是AAAbCCD
或ABAbCDC
。
这是我尝试过的:
print(re.findall("[A-Z]{3}[a-z][A-Z]{3}", l))
但是,这不是我想要的,因为它也匹配AAAbCCD
和ABAbCDC
。
答案 0 :(得分:3)
利用捕获的分组:
^([A-Z])\1\1[a-z]([A-Z])\2\2$
^([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']