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

时间:2018-07-27 19:38:33

标签: python regex

我正在尝试使用正则表达式来匹配文件名列表。它不匹配 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")

如何强制正则表达式只返回包含完整文件名不包含子字符串的版本?

3 个答案:

答案 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]