【问题标题】:Replace strings in a list (using re.sub)替换列表中的字符串(使用 re.sub)
【发布时间】:2021-12-02 20:14:04
【问题描述】:

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

import re

file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa']
file_lst_trimmed =[]

for file in file_lst:
    file_lst_trimmed = re.sub(r'1.fa', '', file)

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

感谢您的建议!

【问题讨论】:

  • 你能澄清你的问题吗?预期的结果是什么?是否要从所有文件名中删除最后一个数字和.fa
  • 是的,我想删除最后一个号码和分机号!

标签: python


【解决方案1】:

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

  1. 您将file_lst_trimmed 设置为在循环的每次迭代中等于您的字符串。你想像file_lst_trimmed.append("apple")一样使用append

  2. 您的正则表达式是 '1.fa',而它实际上应该只是 '.fa'(假设您只想去除 .fa 扩展名)。

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

【讨论】:

    【解决方案2】:

    不需要正则表达式,使用标准库osos.path.splittext

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

    import os.path
    
    l = ['hello.fa', 'images/hello.png']
    
    [os.path.splitext(filename)[0] for filename in l]
    

    返回

    ['hello', 'images/hello']
    

    【讨论】:

      【解决方案3】:

      如果可能的话,我更喜欢 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])
      

      【讨论】:

        【解决方案4】:

        你可以试试这个:

        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']
        

        【讨论】:

        【解决方案5】:

        您可以使用列表推导式来构建具有清理文件名的新列表。 \d 是匹配单个字符的正则表达式,$ 只匹配字符串的末尾。

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

        结果:

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

        【讨论】:

          猜你喜欢
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-12
          • 1970-01-01
          相关资源
          最近更新 更多