【问题标题】:How to replace multiple substrings in a list?如何替换列表中的多个子字符串?
【发布时间】:2016-10-26 00:38:09
【问题描述】:

我需要使用 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'],因此什么也没有发生。

【问题讨论】:

  • 一般情况下我也需要这个,不是专门针对这种情况的。
  • 可以使用正则表达式
  • @BenjaGarrido 是的,它们最容易理解,但不幸的是它们速度较慢。

标签: python regex string list replace


【解决方案1】:

使用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.


list comp答案的完整解释-

要了解什么是列表理解,请阅读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']

现在使用列表推导结构,我们可以遍历它,

>>> [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 两种解决方案。
  • @Jeremy 谢谢,如果我看到你的回答,我就不会编辑。 :)
  • 有人可以准确解释 Rao 的列表理解答案中发生了什么。他加入然后在'-'和'。 ?
  • @mariano 完成,如果您仍有任何疑问,请查看并通知我
  • 为什么我不能使用 reverse 函数呢?
【解决方案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()

【讨论】:

  • 专业提示,总是在代码块之外解释。 cmets 的 CSS 太褪色了,看不出来。
猜你喜欢
  • 2011-09-01
  • 2018-01-23
  • 2021-12-19
  • 2017-06-22
  • 2016-09-10
  • 2017-12-06
  • 2016-03-24
  • 2016-12-03
相关资源
最近更新 更多