如何编写排除某些文件后缀的正则表达式?

时间:2017-01-19 20:39:14

标签: python regex regex-lookarounds

我正在看这里给出的教程: -

https://docs.python.org/2/howto/regex.html#lookahead-assertions

我想排除以.pqr.gz结尾的文件,我不太清楚该怎么做。

例如,预期的行为是: -

f1.gz => succeed
f1.abc.pqr => succeed
f1.pqr.gz => fail
f1.abc.gz => succeed

我能想到的最好的正则表达式是: -

r'.*[.](?=[^.]*[.][^.]*)(?!pqr[.]gz$)[^.]*[.][^.]*$'

这会排除以.pqr.gz结尾的文件,但不允许使用仅为f1.gz的文件(例如我上面写的第一个案例)。

关于如何改进这一点的任何想法?

编辑: - 有更好的方法可以做到这一点(例如,使用string.endswith),但我很好奇如何使用正则表达式纯粹作为练习。

2 个答案:

答案 0 :(得分:0)

好吧,TBH,你对正则表达式的使用对我来说似乎有些过分。你可以这样做:

if not '.pqr.gz' in line:
    print(line)

并完成。

实际上,“简单”的字符串操作可以在一些简单的操作中完成很多操作,例如:

for line in lines:
    file, result = line.split(' => ')
    if file.endswith('.pqr.gz'):
        print("Skipping file {}".format(file), file=sys.stderr)
        continue
    print(file)
    # and you could do something if result == "success" there after!

因为你坚持用regexp来做这件事:

这是您当前的正则表达式

Regular expression visualization

这是一个灵感来自@rawing建议的解决方案:

.*(?<!\.pqr\.gz) =>

Regular expression visualization

答案 1 :(得分:-1)

使用Python的re模块需要注意的一点是re.match隐式锚定到字符串的开头。

此外,您可以通过转义它们来匹配文字句点(\.),这可能比将它放在字符类中更容易阅读(并且可能更快)。

对于re.match,以下正则表达式应该可以解决问题:

r'.*\.pqr\.gz$'

如果使用re.search代替,正则表达式可以简化为:

r'\.pqr\.gz$'