我有以下代码:
haystack = "aaa months(3) bbb"
needle = re.compile(r'(months|days)\([\d]*\)')
instances = list(set(needle.findall(haystack)))
print str(instances)
Run Code Online (Sandbox Code Playgroud)
我希望它可以打印,months(3)但我只是得到它months.这有什么理由吗?
needle = re.compile(r'((?:months|days)\([\d]*\))')
Run Code Online (Sandbox Code Playgroud)
解决你的问题.
你只捕捉了几个月的日子.
在这种特殊情况下,这个正则表达式更好一点:
needle = re.compile(r'((?:months|days)\(\d+\))')
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您只能获得带有数字的结果,之前的结果就像months()是可行的.如果要忽略Months或Days等选项的大小写,则还要添加re.IGNORECASE标志.像这样:
re.compile(r'((?:months|days)\(\d+\))', re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)
对OP的一些解释:
正则表达式由许多元素组成,其中主要是捕获组." ()但有时我们想要制作小组而不捕捉,所以我们使用" (?:)"还有许多其他形式的小组,但这些是最常见的.
在这种情况下,我们将整个正则表达式包围在捕获组中,因为您试图捕获所有内容,通常 - 任何正则表达式都会自动被捕获组包围,但在这种情况下,您明确指定了一个,因此它没有使用自动捕获组围绕正则表达式.
现在我们已经用捕获组包围了整个正则表达式,我们通过添加?:到开头将我们所拥有的组转换为非捕获组,如上所示.我们也可能没有包围整个正则表达式,只将组转换为非捕获组,因为如您所见,它会自动将整个正则表达式转换为非存在的捕获组.我个人更喜欢显式编码.
有关正则表达式的更多信息,请访问:http://docs.python.org/library/re.html
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |