【发布时间】:2020-08-03 13:11:00
【问题描述】:
如果子字符串属于列表,我必须替换字符串中的子字符串
txt = 'lorem ipsum; lorem ipsum. lorem ipsum: loren lorem'
list_punctuation = [', ',': ','; ']
for punct in list_punctuation:
txt = txt.replace(punct,punct + '<<')
这就是典型的方式。我遍历列表的元素并进行替换,其中包括在标点符号后包含一个符号“
问题是是否有更 Pythonic 的方式来做到这一点。我不喜欢那个循环,除了丑陋之外,它可能很慢。
有什么想法吗?
编辑1
正则表达式有效。但我仍然认为有一个没有使用外部库的pythonic one liner(即使 re 是标准的一部分)。为什么我要参考非正则表达式解决方案?因为列表将单独构建,并且会随着时间而改变。更改列表比更改正则表达式更容易。我现在不知道该列表将包含什么内容。标点符号列表就是一个简短的例子。
EDIT2 答案中建议了两个链接。
a) 第一个是关于条件替换。这里没有条件,只是列表的元素。在此链接中,提供了多线解决方案。我的问题是关于找到一个班轮。这个问题的目的是找到一个更简洁的解决方案。
How to replace multiple substrings of a string?
b) 这个问题是关于替换字符的,没有提到包含要替换的元素的列表。在 b) 中,多行编码不是问题,而这正是问题所在。 Best way to replace multiple characters in a string?
NOR a) 或 b) 是解决方案。但没关系,这个问题已经被阻止了,坚持那里有解决方案。
【问题讨论】:
-
在这两个链接以及这个问题中,您总共有 36 个答案。我很确定他们涵盖了所有这样做的方法。此外,“b”正是您所描述的。您有一个列表这一事实只是有多个字符要替换这一事实的一个小细节。顺便说一句,在那个问题中还有 2 个其他相关问题的链接
-
没有一个单一的线性解决方案引用一个列表。我已经看过这些问题了。一个正则表达式解决方案,很好,不引用列表。
-
像这样:
pattern = re.compile(r"[{}]".format("".join(punctuation)))) -
这里使用的字典只是为了允许不同的替换规则。但是你有一个规则:总是添加
<<,所以字典归结为一个列表 -
您也可以通过再次使用
punc_string = "".join(punct_list)来使用that answer,您甚至可以将其修改为一行(如果这很重要......)或者更好的是,将代码包装在您的问题中用一个函数,然后用一行调用它!