我正在尝试使用正则表达式匹配文件名列表。与其只匹配全名,不如同时匹配名称和名称的子字符串。
三个示例文件是
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]