查找没有给定扩展名的文件

2024-06-09 10:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了以下代码

import re

regobj = re.compile(r"^.+\.(oth|xyz)$")

for test in ["text.txt", "other.oth", "abc.xyz"]:
    if regobj.match(test):
        print("Method 1:", test)

regobj = re.compile(r"^.+\.[^txt]$")

for test in ["text.txt", "other.oth", "abc.xyz"]:
    if regobj.match(test):
        print("Method 2:", test)

我希望第二种方法能找到任何没有扩展名txt的文件,但我尝试的方法并不好。我做错什么了


Tags: textintestretxtforifmatch
3条回答

正如Martijn Pieters提到的regex是过度杀戮,考虑到还有其他更有效的方法:

fileName, fileExt = os.path.splitext(string)

使用splitext隔离扩展非常简单

import os

fileDict = ["text.txt", "other.oth", "abc.xyz"]
matchExt = ".txt"

for eachFile in fileDict:
    fileName, fileExt = os.path.splitext(eachFile)
    if matchExt not in fileExt:
        print("(not %s) %s %s" % (matchExt, fileExt, fileName))

您可以很容易地添加一个else语句来匹配其他扩展,这由您决定

正则表达式在这里是多余的。使用^{} method

if not str.endswith('.txt'):

正则表达式使用负字符类,它是不应匹配的字符集。任何不是tx的东西都将满足该测试。您可以显式地匹配.txt,并使用not来排除而不是包含:

regobj = re.compile(r"^.+\.txt$")

if not regobj.match(test):

如果您只能使用正则表达式,请使用否定的前瞻断言

 regobj = re.compile(r"^[^.]+\.(?!txt$)[^.]+$")

这里(?!...)只匹配后面一直到字符串末尾没有文字txt的位置。然后[^.]+匹配任何数量的非.字符,直到字符串结束

将第二个正则表达式改为

regobj = re.compile(r"^.+\.(?!txt$)[^.]+$")

[^txt]匹配任何不属于tx的字符(?!txt$)断言点后面不会跟txt。在\.之后的[^.]+断言在点之后必须至少存在一个字符。因此它匹配具有任何扩展名但不具有.txt的文件名

相关问题 更多 >