2

例如,我有字符串:

s = 'Back in BLACK, I hit the sAck, I've been too LOng I'm glad to be back.'

在上面的字符串中,我想用以下单词以不区分大小写的方式搜索和替换某些单词

黑色:b***

麻袋:s***

长:l***

高兴: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 这样的词来说,这是一项艰巨的任务,因为有很多组合!

我该怎么做呢?

4

2 回答 2

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."
于 2013-02-11T17:25:26.820 回答
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."
于 2013-02-11T17:32:27.223 回答