我正在尝试使用正则表达式来匹配文件名列表。它不匹配 just 的全名,而是匹配名称和名称的子字符串。
三个示例文件是
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="\n\n")
我知道
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")
如何强制正则表达式只返回包含完整文件名而不包含子字符串的版本?
答案 0 :(得分:1)
您应该使用c
使'?:'
模式不被捕获
c = r"(?:daily|daily_images|monthly)"
答案 1 :(得分:0)
这正常工作。您看到的问题是组在正则表达式中的工作方式。您的正则表达式setTextValue
用括号括起来。正则表达式中的括号表示应将此匹配项视为一个组。通过打印c
,您正在打印所有匹配组的元组。幸运的是,组中的第一个元素始终是完全匹配项,因此只需使用以下内容:
m.group()
答案 2 :(得分:0)
我知道您只在寻找正则表达式解决方案,但是您可以轻松地使用os模块拆分扩展并返回索引0。否则,如Bill S.所述,m.groups()[0]
返回正则表达式组的第0个索引。 。
# os solution
import os
s = "1997_06_daily.txt"
os.path.splitext(s)[0]