Python 替换列表中的字符串(使用re.sub)

Python 替换列表中的字符串(使用re.sub),python,Python,我正在尝试替换文件列表中的部分文件扩展名。我希望能够通过项目(文件)循环,并删除扩展名。当re.sub作为第三个参数需要字符串时,我不知道如何适当地循环列表中的项。例如,re.sub(模式、repl、字符串、计数=0、标志=0) 这里出现的问题是re.sub需要一个字符串,我希望它在字符串列表中循环 谢谢你的建议 如果可能的话,我更喜欢python内部函数,而不是导入和使用库。对于这样简单的任务,使用正则表达式可能不是最好的方法。这种方法看起来很干净 试试这个 file_lst = ['cats

我正在尝试替换文件列表中的部分文件扩展名。我希望能够通过项目(文件)循环,并删除扩展名。当re.sub作为第三个参数需要字符串时,我不知道如何适当地循环列表中的项。例如,re.sub(模式、repl、字符串、计数=0、标志=0)

这里出现的问题是re.sub需要一个字符串,我希望它在字符串列表中循环


谢谢你的建议

如果可能的话,我更喜欢python内部函数,而不是导入和使用库。对于这样简单的任务,使用正则表达式可能不是最好的方法。这种方法看起来很干净

试试这个

file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa']
file_lst_trimmed =[]
for file in file_lst:
    file_lst_trimmed.append(file.split('.')[0][:-1])

您可以使用列表理解来构造带有已清理文件名的新列表
\d
是匹配单个字符的正则表达式,
$
仅在字符串末尾匹配

file_lst_trimmed = [re.sub(r'\d\.fa$', '', file) for file in file_lst]
结果是:

>>> file_lst_trimmed 
['cats', 'cats', 'dog', 'dog']

不需要正则表达式,请使用标准库
os
,并执行此操作

将路径名路径拆分为一对(root,ext),以便root+ext ==路径,ext为空或以句点开头,最多包含一个句点。忽略basename上的前导句点; splitext('.cshrc')返回('.cshrc','')

返回

['hello', 'images/hello']

您的循环实际上非常好!还有两个问题

  • 在循环的每次迭代中,您将
    file_lst_trimmed
    设置为与字符串相等。您希望使用
    append
    ,如
    文件\u lst\u trimmed.append(“苹果”)
    中所示

  • 正则表达式是
    '1.fa'
    ,而它实际上应该是
    '.fa'
    (假设您只想剥离.fa扩展名)

  • 编辑:我现在看到您还想删除最后一个数字。在这种情况下,您将需要
    '\d+\.fa'
    \d
    是任何数字0-9的替代,而
    \d+
    表示任何长度的数字字符串——因此这将删除10、11、13254等。
    之前的
    是因为
    是需要转义的特殊字符。)如果要删除任意文件扩展名,则需要放置
    \w+
    而不是
    fa
    ——任意长度的字母字符串。您可能想查看

    您可以尝试以下方法:

    import re
    file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa']
    final_list = [re.sub('\d+\.\w+$', '', i) for i in file_lst]
    
    输出:

    ['cats', 'cats', 'dog', 'dog']
    

    你能澄清你的问题吗?预期的结果是什么?是否要从所有文件名中删除最后一个数字和
    .fa
    ?是,我要删除最后一个数字和扩展名!当然,这是最好的代码,但正则表达式在不熟悉的人看来像胡言乱语。如果能解释一下为什么你的答案是这样的,那就太好了。OP备忘单:
    import re
    file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa']
    final_list = [re.sub('\d+\.\w+$', '', i) for i in file_lst]
    
    ['cats', 'cats', 'dog', 'dog']