用Python中的另一个字符替换字符串中的多个字符

时间:2019-07-01 02:12:03

标签: python string replace list-comprehension

我有一个字符串列表,我想检查每个字符串是否包含某些字符,如果确实包含,则将其替换为另一个字符。

我有类似下面的内容:

invalid_chars = [' ', ',', ';', '{', '}', '(', ')', '\\n', '\\t', '=']
word = 'Ad{min > HR'
for c in list(word):
  if c in invalid_chars:
    word = word.replace(c, '_')
print (word) 

>>> Admin_>_HR

我正在尝试使用列表理解将其转换为函数,但是我是奇怪的人物...

def replace_chars(word, checklist, char_replace = '_'):
  return ''.join([word.replace(ch, char_replace) for ch in list(word) if ch in checklist])

print(replace_chars(word, invalid_chars))
>>> Ad_min > HRAd{min_>_HRAd{min_>_HR

3 个答案:

答案 0 :(得分:3)

尝试以下一般模式:

''.join([ch if ch not in invalid_chars else '_' for ch in word])

有关完整功能:

def replace_chars(word, checklist, char_replace = '_'):
  return ''.join([ch if ch not in checklist else char_replace for ch in word])

注意:无需将字符串word包裹在list()中,它已经可以迭代了。

答案 1 :(得分:3)

这可能是str.translate()的好用法。您可以使用str.maketrans()invalid_chars转换为翻译表,并在需要的地方应用:

invalid_chars = [' ', ',', ';', '{', '}', '(', ')', '\n', '\t', '=']
invalid_table = str.maketrans({k:'_' for k in invalid_chars})

word = 'Ad{min > HR'

word.translate(invalid_table)

结果:

'Ad_min_>_HR'

如果您需要将此翻译应用于多个字符串并且效率更高,这将特别好,因为您不需要每次为每个字母遍历整个invalid_chars数组时if x in invalid_chars循环内。

答案 2 :(得分:2)

使用正则表达式更容易。您可以通过一个替换调用来搜索整个字符组。它也应该表现更好。

<div class="p-progress-bar-container radius small title-up">
<div  class="p-progress-bar" data-percent="<?= $box['tersedia'];?>" data-delay="100" data-type="%"  id="progtersedia">
    <div class="progress-title" >Kosong</div>
    </div>
</div>

f字符串中的代码构建了如下所示的正则表达式模式

>>> import re
>>> re.sub(f"[{re.escape(''.join(invalid_chars))}]", "_", word)
'Ad_min_>_HR'

也就是包含每个无效字符的正则表达式字符集。 (反斜杠转义确保无论将>>> pattern = f"[{re.escape(''.join(invalid_chars))}]" >>> print(repr(pattern)) '[\\ ,;\\{\\}\\(\\)\\\n\\\t=]' >>> print(pattern) [\ ,;\{\}\(\)\ \ =] 放在哪个字符中,都不会将它们解释为正则表达式控制字符。)如果首先将它们指定为字符串,则invalid_chars不需要。

如果您需要在多个单词上重复使用该模式,也可以编译模式(使用''.join())。