正面正向的Python正则表达式可选捕获组

时间:2018-10-23 17:48:20

标签: python regex python-2.7 regex-lookarounds

试图找到某些文件夹模式。我可以有一个简单的if语句,但现在我想知道,这可以用一种正则表达式模式完成吗?

文件夹:

name
name_a01
name_a02
..
name_a20

name_dontuse_a10 <不需要这种模式

pattern = re.match(".*name(_a[0-9])?", dir)

以上内容正确匹配,但同时匹配namename_dontuse_a10

pattern.group(1)

为这两个文件夹返回None,所以对我没有太大帮助。

我无法预测不需要的文件夹将被命名为什么,但是我想要基本名称文件夹和任何name_a## folder。我想我需要提前进行邮政搜索,但不确定如何将其与可选的捕获组配合使用。

2 个答案:

答案 0 :(得分:1)

尝试使用此版本:

pattern = re.match(".*name(_a[0-9]*)?$", dir)

我刚添加了$来匹配第一个下划线之后的字符串结尾。我还添加了[0-9]*以匹配零个或多个数字。

实时示例:

https://regex101.com/r/MSldc6/2/

答案 1 :(得分:1)

最好的解决方案是首先从路径中提取文件名,因此您不必在正则表达式中处理它。 normpath删除所有结尾的/,而basename提取文件名。因此,对于dir1/dir2/name/,您将获得name

import os, re

dir = ...
name = os.path.basename(os.path.normpath(dir))

pattern = re.match("name(_a\d+)?", name)

请注意,您原始解决方案中发生的事情是.*与整个字符串匹配,从而导致了意外的行为。