如何在Python中不区分大小写地替换字符串中的多个单词?
假设我有一个字符串:
s = 'Back in BLACK, I hit the sAck, I've been too LOng I'm glad to be back.'
在这个字符串中,我想要不区分大小写地搜索并替换某些单词,替换成以下的内容:
black : b***
sack : s***
long : l***
glad : g***
我希望最终得到的字符串是:
s = 'Back in B****, I hit the s***, I've been too L*** I'm glad to be back.'
基本上,上面的字符串会保留我替换的单词首字母的大小写。单词后面的字母会用'*'来代替。
我想我需要做一个替换的列表。在Django中,我目前使用的是replace_all()函数,但这个函数是区分大小写的。所以像BLACK和sAck这样的单词就变得很麻烦,因为有很多组合!
我该怎么做呢?
2 个回答
2
这段内容有点复杂,但可以用:
>>> re.sub(
r"(?i)\b(black|sack|long|glad)\b",
lambda m: m.group()[0] + "*"*(len(m.group())-1),
s
)
"Back in B****, I hit the s***, I've been too L*** I'm g*** to be back."
5
使用re模块,下面是一个关于“黑色”的简单例子:
>>> import re
>>> s = "Back in BLACK, I hit the sAck, I've been too LOng I'm glad to be back."
>>> regex = re.compile(r'black', flags=re.IGNORECASE)
>>> regex.sub('b***', s)
"Back in b***, I hit the sAck, I've been too LOng I'm glad to be back."
为了保留首字母的大小写,先把它捕获,然后在替换时用回引用:
>>> regex = re.compile(r'(b)lack', flags=re.IGNORECASE)
>>> regex.sub(r'\1***', s)
"Back in B***, I hit the sAck, I've been too LOng I'm glad to be back."
要一次性完成所有替换:
>>> regex = re.compile(r'(?=(.))(?:black|sack|long|glad)', flags=re.IGNORECASE)
>>> regex.sub(r'\1***', s)
"Back in B***, I hit the s***, I've been too L*** I'm g*** to be back."