我想使用正则表达式(并且仅限正则表达式)排除目录中的“.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)
有人看一下出了什么问题吗?
^.*(?!txt)$不起作用的原因是因为您使用的是负前瞻,但是,由于贪婪的本质.*和锚点$位于字符串的末尾,因此在那一点上没有任何东西,(所以没有什么会失败的)。
你想要做的事情可以通过消极的后视来实现,它向后工作,看起来像(^.*(?<!txt)$)
应该注意的是,虽然lookbehind在这里起作用,但Python只允许使用固定长度的字符串(lookahead没有这个限制)。
其他正则表达式实现允许有限长度的lookbehinds(即不能使用.*但可以do .{0,10}),而其他正则表达式实现(包括JavaScript)则根本不支持lookbehind。
(如果你需要这个用于非固定匹配或在 JS 环境中,那么.*txt$否定结果的建议可以解决这个问题。)
有关前向和后向的更多信息,请查看此页面:http://www.regular-expressions.info/lookaround.html
(当然,理想情况下,您应该\.txt在正则表达式中使用以确保它是完整的扩展名,最有效的解决方案可能是已经建议的x.endswith('.txt')方法。)
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |