首页 > 解决方案 > 查找和替换字符串中的混淆词或短语

问题描述

我正在尝试在字符串中查找单个单词或 n 个单词的短语,然后将其替换为星号。挑战是即使单词或 n 词短语被某些字符混淆,我也想这样做。

假设如下。REPLACE_CHAR是我想用来替换单词或 n 词短语的字符。ILLEGAL_CHAR是我想忽略的字符。我也希望这忽略大小写。

REPLACE_CHAR = "*"
ILLEGAL_CHAR = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

示例一

在这里,我想用星号替换“dolor”。在字符串中,您可以看到“dolor”存在,但它被随机符号和大写字母混淆了。

string = "Lorem ipsum %@do^l&oR sit amet"
find = "dolor"

想法结果将是"Lorem ipsum ***** sit amet"星号的数量与找到的单词的长度相匹配。

示例二

在这里,我想在保留空格的同时用星号替换“dolor sit”。在字符串中,您可以看到“dolor sit”存在,但它被随机符号和大写字母混淆了。

string = "Lorem ipsum %@do^l&oR s%)i!T~ amet"
find = "dolor sit"

想法结果将是"Lorem ipsum ***** *** amet"星号的数量与找到的单词的长度相匹配。


更新#1

这个解决方案建立在@Ajax1234 响应之上。

我们不是使用re.subto remove ILLEGAL_CHAR,而是translate在函数外部使用和构建表。这有轻微的性能提升。

import re

REPLACE_CHAR = "*"
ILLEGAL_CHAR = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

trans = str.maketrans("", "", ILLEGAL_CHAR)
text = "Lorem ipsum %@do^l&oR sit amet"
token = "dolor sit"

def replace(data, token):
    data = data.translate(trans)
    return re.sub(token, lambda x:' '.join('*'*len(i) for i in x.group().split(' ')), data, flags=re.I)

print(replace(text, token))

标签: pythonregex

解决方案


import re

ignore_chars = "!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"

string = "Lorem ipsum %@do^l&oR s%)i!T~ amet"

clean_string = "".join(char for char in string if char not in ignore_chars)

bad_words = ["dolor", "sit"]

for bad_word in bad_words:
    pattern = f"\\b{bad_word}\\b"
    replace = "*" * len(bad_word)
    clean_string = re.sub(pattern, replace, clean_string, flags=re.IGNORECASE)

print(clean_string)

输出:

Lorem ipsum ***** *** amet

推荐阅读