我有一个字符串列表,我想检查每个字符串是否包含某些字符,如果确实包含,则将其替换为另一个字符。
我有类似下面的内容:
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
答案 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()
)。