2

我有以下代码:

haystack = "aaa months(3) bbb"
needle = re.compile(r'(months|days)\([\d]*\)')
instances = list(set(needle.findall(haystack)))
print str(instances)

我希望它可以打印months(3),但我只是得到months. 这有什么原因吗?

4

2 回答 2

7
needle = re.compile(r'((?:months|days)\([\d]*\))')

解决您的问题。

您只捕获了几个月|几天的部分。

在这种特定情况下,这个正则表达式要好一些:

needle = re.compile(r'((?:months|days)\(\d+\))')

这样你只会得到一个数字的结果,以前的结果就像months()工作一样。如果您想忽略月份或日期等选项的大小写,则还要添加re.IGNORECASE标志。像这样:

re.compile(r'((?:months|days)\(\d+\))', re.IGNORECASE)

对 OP 的一些解释:

正则表达式由许多元素组成,其中最主要的是捕获组。" ()" 但有时我们想组组而不捕获,所以我们使用 " (?:)" 组还有很多其他形式,但这些是最常见的。

在这种情况下,我们将整个正则表达式包围在一个捕获组中,因为您通常会尝试捕获所有内容 - 任何正则表达式都会自动被捕获组包围,但在这种情况下,您明确指定了一个,所以它没有用自动捕获组包围您的正则表达式。

现在我们已经用一个捕获组包围了整个正则表达式,我们通过添加到开头将我们拥有的组变成一​​个非捕获组?:,如上所示。我们也不能包围整个正则表达式,只将组变成非捕获组,因为如您所见,它会自动将整个正则表达式转换为 non 存在的捕获组。我个人更喜欢显式编码。

关于正则表达式的更多信息可以在这里找到:http: //docs.python.org/library/re.html

于 2012-09-19T13:36:57.907 回答
1

Parens 不仅用于分组,还用于形成捕获组。你想要的是re.compile(r'(?:months|days)\(\d+\)'). 这对 or 条件使用了非捕获组,并且不会为您提供一堆您在使用 findall 时似乎不想要的子组匹配项。

于 2012-09-19T13:42:02.680 回答