我有以下代码:
haystack = "aaa months(3) bbb"
needle = re.compile(r'(months|days)\([\d]*\)')
instances = list(set(needle.findall(haystack)))
print str(instances)
我希望它可以打印months(3)
,但我只是得到months
. 这有什么原因吗?
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
Parens 不仅用于分组,还用于形成捕获组。你想要的是re.compile(r'(?:months|days)\(\d+\)')
. 这对 or 条件使用了非捕获组,并且不会为您提供一堆您在使用 findall 时似乎不想要的子组匹配项。