繁体   English   中英

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

[英]Replacing multiple chars in string with another character in Python

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

我有类似以下内容:

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

尝试以下一般模式:

''.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() ,它已经可以迭代了。

这对于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循环内的if x in invalid_chars

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

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

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

>>> pattern = f"[{re.escape(''.join(invalid_chars))}]"
>>> print(repr(pattern))
'[\\ ,;\\{\\}\\(\\)\\\n\\\t=]'
>>> print(pattern)
[\ ,;\{\}\(\)\
\   =]

也就是说,包含每个无效字符的正则表达式字符集。 (反斜杠转义确保无论将invalid_chars放在哪个字符中,都不会将它们解释为正则表达式控制字符。)如果首先将它们指定为字符串,则不会将''.join()需要。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM