如何替换列表中的多个子字符串?

时间:2016-06-23 15:17:44

标签: python regex string list replace

我需要使用for循环将input_string转换为下面的注释。首先我使用split()函数对其进行切片,但现在我需要以某种方式将输入字符串转换为['result1', 'result2', 'result3', 'result5']。我尝试将.xls和短划线替换为空(''),但字符串输出未更改。请不要导入任何内容,我只是尝试使用函数和循环。

input_string = "01-result.xls,2-result.xls,03-result.xls,05-result.xls" 
# Must be turned into ['result1','result2', 'result3', 'result5']

splitted = input_string.split(',')

for c in ['.xls', '-', '0']:
    if c in splitted:
        splitted = splitted.replace(splitted, 'c', '')

当我输入splitted时,输出为['01-result.xls', '2-result.xls', '03-result.xls', '05-result.xls'],因此不会发生任何事情。

2 个答案:

答案 0 :(得分:3)

使用re module's sub功能和split

>>> input_string = "01-result.xls,2-result.xls,03-result.xls,05-result.xls" 
>>> import re
>>> re.sub(r'(\d+)-(\w+)\.xls',r'\2\1',input_string)
'result01,result2,result03,result05'
>>> re.sub(r'(\d+)-(\w+)\.xls',r'\2\1',input_string).split(',')
['result01', 'result2', 'result03', 'result05']

不使用导入,您可以使用list comprehension

>>> [''.join(x.split('.')[0].split('-')[::-1]) for x in input_string.split(',')]
['result01', 'result2', 'result03', 'result05']

这里的算法是,我们在,上拆分后循环遍历字符串。现在,我们将.上的单个词和-上的第一个元素分开。我们现在有了数字和单词,我们可以轻松join.

列表补答的完整说明 -

要了解列表理解是什么,请阅读What does "list comprehension" mean? How does it work and how can I use it?

得出答案,

,上拆分输入列表,为我们提供了单个文件名列表

>>> input_string.split(',')
['01-result.xls', '2-result.xls', '03-result.xls', '05-result.xls']

现在使用list comprehension构造,我们可以遍历这个,

>>> [i for i in input_string.split(',')]
['01-result.xls', '2-result.xls', '03-result.xls', '05-result.xls']

由于我们只需要文件名而不是扩展名,因此我们split使用.并获取第一个值。

>>> [i.split('.')[0] for i in input_string.split(',')]
['01-result', '2-result', '03-result', '05-result']

现在我们需要的是数字和名称两部分。所以我们再次按-

分开
>>> [i.split('.')[0].split('-') for i in input_string.split(',')]
[['01', 'result'], ['2', 'result'], ['03', 'result'], ['05', 'result']]

现在我们在列表中有[number,name],但我们需要的格式为"namenumber"。因此我们有两个选择

  • 将他们称为i.split('.')[0].split('-')[1]+i.split('.')[0].split('-')[0]。这是一个不必要的漫长道路
  • 反转他们并加入。我们可以使用切片来反转列表(请参阅How can I reverse a list in python?)和str.join以加入''.join(x.split('.')[0].split('-')[::-1])

所以我们得到了最终的列表理解

>>> [''.join(x.split('.')[0].split('-')[::-1]) for x in input_string.split(',')]
['result01', 'result2', 'result03', 'result05']

答案 1 :(得分:2)

如果您不想使用re。

,这是使用列表理解和字符串操作的解决方案
input_string = "01-result.xls,2-result.xls,03-result.xls,05-result.xls"
 # Must be turned into ['result1','result2', 'result3', 'result5']

splitted = input_string.split(',')

#Remove extension, then split by hyphen, switch the two values,
#and combine them into the result string
print ["".join(i.split(".")[0].split("-")[::-1]) for i in splitted]

#Output
#['result01', 'result2', 'result03', 'result05']

此列表理解的工作方式是:

  1. 获取结果列表并删除“.xls”。 i.split(".)[0]
  2. 拆分-并切换号码和“结果”的位置。 .split("-")[::-1]
  3. 对于列表中的每个项目,将列表加入字符串。 "".join()