在python正则表达式中匹配文件名而不是子字符串



我正在尝试使用正则表达式匹配文件名列表。与其只匹配全名,不如同时匹配名称和名称的子字符串。

三个示例文件是

t0 = r"1997_06_daily.txt"
t1 = r"2010_12_monthly.txt"
t2 = r"2018_01_daily_images.txt"

我使用的是正则表达式d

a = r"[0-9]{4}"
b = r"_[0-9]{2}_"
c = r"(daily|daily_images|monthly)"
d = r"(" + a + b + c + r".txt)"

当我跑步时

t0 = r"1997_06_daily.txt"
t1 = r"2010_12_monthly.txt"
t2 = r"2018_01_daily_images.txt"
a = r"[0-9]{4}"
b = r"_[0-9]{2}_"
c = r"(daily|daily_images|monthly)"
d = r"(" + a + b + c + r".txt)"
for t in (t0, t1, t2):
m = re.match(d, t)
if m is not None:
print(t, m.groups(), sep="n", end="nn")

我得到

1997_06_daily.txt
("1997_06_daily.txt", "daily")
2010_12_monthly.txt
("2010_12_monthly.txt", "monthly")
2018_01_daily_images.txt
("2018_01_daily_images.txt", "daily_images")

如何强制regex只返回包含完整文件名的版本,而不返回子字符串

您应该使用'?:'使您的c模式不捕获

c = r"(?:daily|daily_images|monthly)"

这是正常工作的。您看到的问题是组如何在regex中工作。正则表达式c在括号中。正则表达式中的括号表示应将此匹配视为一个组。通过打印m.group(),您打印的是所有匹配组的元组。幸运的是,组中的第一个元素总是完全匹配,所以只需使用以下内容:

print(t, m.groups()[0], sep="n", end="nn")

我知道您只是在寻找regex解决方案,但您可以很容易地使用os模块来拆分扩展并返回索引0。否则,如Bill S.所述,m.groups()[0]返回正则表达式组的第0个索引。

# os solution
import os
s = "1997_06_daily.txt"
os.path.splitext(s)[0]

最新更新