1

给定一个文本,我需要检查每个字符是否在两边都精确(编辑)了3 个大写字母,如果有,则将其添加到返回的此类字符的字符串中。

我写了以下内容:(m = re.match("[A-Z]{3}.[A-Z]{3}", text) 假设 text="AAAbAAAcAAA")

我希望在匹配对象中得到两组:“AAAbAAA”和“AAAcAAA”

现在,当我调用时,m.group(0)我得到“AAAbAAA”,这是正确的。然而,在调用时m.group(1),我发现没有这样的组,这意味着“AAAcAAA”不匹配。为什么?

此外,在调用时m.groups(),我得到一个空元组,尽管我应该得到一个匹配的元组,这意味着在我的情况下我应该得到一个带有“AAAbAAA”的元组。为什么那行不通?

4

2 回答 2

4

您的模式中没有任何组。要捕获组中的某些内容,您必须用括号括起来:

([A-Z]{3}).[A-Z]{3}

例外是m.group(0),它将始终包含整个匹配项。

查看您的问题,听起来您实际上并不是在寻找捕获组,而是在寻找重叠匹配。在正则表达式中,组是指匹配的一小部分,留作以后使用。例如,如果您尝试将电话号码与类似

([0-9]{3})-([0-9]{3}-[0-9]{4})

然后区号将在group(1),本地部分在group(2),整个事物将在group(0)

你想要的是找到重叠的匹配。这是一个 Stack Overflow 答案,它解释了如何在 Python regex 中进行重叠匹配这是我最喜欢的捕获组和一般正则表达式的参考。

于 2012-05-25T17:25:14.143 回答
2

一,match当它看起来像你想要的时候你正在使用findall。它不会抓住封闭的大写三元组,但re.findall('[A-Z]{3}([a-z])(?=[A-Z]{3})', search_string)会让你所有的单个小写字符两边都被 3 个大写字母包围。

于 2012-05-25T17:25:03.027 回答