Python 试图找到一种方法来过滤掉字符串中的某些部分

Python 试图找到一种方法来过滤掉字符串中的某些部分,python,string,Python,String,我试图过滤掉在for循环中出现的文件名中的字符串 if search == "List": onlyfiles = [f for f in listdir("path") if isfile(join("path", f))] for i in onlyfiles: print(i) 现在,它将输出所有文件名,正如预期和需要的那样,但我想过滤掉文件末尾的.json以及文件名中的其他一些元素,以便我可以看到文件名 例如:filename-I

我试图过滤掉在for循环中出现的文件名中的字符串

if search == "List":
        onlyfiles = [f for f in listdir("path") if isfile(join("path", f))]
        for i in onlyfiles:
            print(i)
现在,它将输出所有文件名,正如预期和需要的那样,但我想过滤掉文件末尾的.json以及文件名中的其他一些元素,以便我可以看到文件名

例如:filename-IDENTIFIER.json 我想从for循环的输出中过滤掉“-IDENTIFIER.json”

感谢您的帮助

在“-”上拆分字符串并获取第一个元素:

filename = f.split("-")[0]

如果文件名包含“-”,则会出现混乱。

根据数据的变化程度,这里有几种方法: 因此,让我们尝试构建一个
get\u filename(f)
方法

又快又脏 如果您知道
f
总是以完全相同的方式结束,那么您可以直接尝试删除这些字符。因此,这里我们必须删除最后16个字符。在Python中,字符串可以被视为(不可变的)字符数组,因此您也可以使用列表索引

get_filename(f: str):
    return f[:-16]
但是,如果标识符或后缀的长度发生变化,则此操作将失败

变长 如果后缀根据长度而改变,则应在固定分隔符上拆分字符串并返回相关部分。在这种情况下,您希望在
-
上拆分

get_filename(f: str):
    return f.split("-")[0]
但是请注意,如果文件名还包含
-
,则此操作将失败。 您可以通过以下方式删除最后一部分并重新连接所有早期部分来修复此问题

get_filename(f: str):
    return "-".join(f.split("-")[:-1])
使用正则表达式匹配格式 最通用的方法是使用python选择相关部分。这些允许您非常明确地针对特定的模式。您需要的确切正则表达式取决于字符串的复杂性。

这应该可以:

i.split('-')[0].split('.')[0]
案例1
文件名标识符.json

它将子字符串置于破折号之前,因此输出将变为
filename

案例2
filename.json

字符串中没有破折号,因此第一次拆分不会执行任何操作(完整字符串将位于第0个元素中),然后它将在点之前获取子字符串。输出将是
filename

案例3
文件名

无需拆分,输出将为
文件名

如果它总是
.json
-IDENTIFIER
,那么使用它更安全:

i.split('-IDENTIFIER')[0].split('.json')[0]
案例4
文件名blablabla.json


如果文件名中有一个额外的破折号,则不会有问题,输出将是
filename blabla

标识符的格式是什么?如果它总是有破折号,您可以使用破折号作为分隔符拆分文件名。@meowgoethedog它可以是数字、字母或组合。因此,使用此技术,文件名只能包含一个“-”,对吗?确实如此,但我添加了一种可以处理多个“-”的替代方法。文件名将始终具有-IDENTIFIER,因此我不需要使用“.”拆分,但很高兴知道以防万一。