[英]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.