排除“.txt”文件

elh*_*tis 4 python regex

我想使用正则表达式(并且仅限正则表达式)排除目录中的“.txt”文件。但这段代码不起作用,我不明白为什么。我有这个清单:

['/var/tmp/COMMUN/4.1.0_41/Apache',
 '/var/tmp/COMMUN/4.1.0_41/META-INF', 
 '/var/tmp/COMMUN/4.1.0_41/RewriteRules',
 '/var/tmp/COMMUN/4.1.0_41/Robots', 
 '/var/tmp/COMMUN/4.1.0_41/smokeTest',
 '/var/tmp/COMMUN/4.1.0_41/tutu.txt']
Run Code Online (Sandbox Code Playgroud)

我正在尝试这段代码

# list_dit is a personal function
list_dir(toto, filter_function=lambda x: re.match("^.*(?!txt)$", x))
Run Code Online (Sandbox Code Playgroud)

有人看一下出了什么问题吗?

Pet*_*ton 5

^.*(?!txt)$不起作用的原因是因为您使用的是负前瞻,但是,由于贪婪的本质.*和锚点$位于字符串的末尾,因此在那一点上没有任何东西,(所以没有什么会失败的)。

你想要做的事情可以通过消极的后视来实现,它向后工作,看起来像(^.*(?<!txt)$)

应该注意的是,虽然lookbehind在这里起作用,但Python只允许使用固定长度的字符串(lookahead没有这个限制)。
其他正则表达式实现允许有限长度的lookbehinds(即不能使用.*但可以do .{0,10}),而其他正则表达式实现(包括JavaScript)则根本不支持lookbehind。

(如果你需要这个用于非固定匹配或在 JS 环境中,那么.*txt$否定结果的建议可以解决这个问题。)

有关前向和后向的更多信息,请查看此页面:http://www.regular-expressions.info/lookaround.html

(当然,理想情况下,您应该\.txt在正则表达式中使用以确保它是完整的扩展名,最有效的解决方案可能是已经建议的x.endswith('.txt')方法。)