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