我正在看这里给出的教程: -
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
),但我很好奇如何使用正则表达式纯粹作为练习。
答案 0 :(得分:0)
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来做这件事:
这是您当前的正则表达式
这是一个灵感来自@rawing建议的解决方案:
.*(?<!\.pqr\.gz) =>
答案 1 :(得分:-1)
使用Python的re
模块需要注意的一点是re.match
隐式锚定到字符串的开头。
此外,您可以通过转义它们来匹配文字句点(\.
),这可能比将它放在字符类中更容易阅读(并且可能更快)。
对于re.match
,以下正则表达式应该可以解决问题:
r'.*\.pqr\.gz$'
如果使用re.search
代替,正则表达式可以简化为:
r'\.pqr\.gz$'