如何在Python中不区分大小写地替换字符串中的多个单词?

2 投票
2 回答
3073 浏览
提问于 2025-04-17 15:31

假设我有一个字符串:

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."

撰写回答