python - 查找和替换字符串中的混淆词或短语
问题描述
我正在尝试在字符串中查找单个单词或 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.sub
to 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))
解决方案
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
推荐阅读
- python - 如何对 pandas 中的组进行多次计算并将其写入新的数据帧?
- java - 如何使用本机查询返回几何?[解决了]
- swagger - 带有 HTTP URL 的 Swagger $ref
- encoding - zlib 选项 Z_NO_COMPRESSION 导致文件更大
- php - Laravel/Livewire/x-components 如何传递数组?
- delphi - 如何使用通过 Indy 购买的证书?
- c - 为什么 pow 函数给我不好的结果?
- ignite - 集群的 BaselineHistory 不包含加入节点 BlT 的分支点哈希
- hyperledger-fabric - 在运行 Hyperledger 客户端的 SigningIdentityInfo 中找不到 KeyMaterial
- azure-cli - Azure CLI - 如何获取存储容器的 ResourceId?