【发布时间】:2019-08-14 03:05:02
【问题描述】:
我正在尝试在字符串中查找单个单词或 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 删除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))
【问题讨论】:
-
不知道使用
regex的方法,但您可以使用Longest common sub sequence.找到匹配模式 -
当您感兴趣的单词或短语之外有混淆字符时,您想要什么行为?例如,如果字符串是
string = "Lorem ipsum %@do^l&oR s%)i!T~ amet ()*+,-./:;<=>?@[\\]^_