我正在尝试为我们的聊天服务添加更高效的发誓过滤器,并且似乎无法让我的正则表达式在我的live django服务器上运行。
我在Python 2.6.7上运行最新的稳定Django。
这是我的代码:
def replacement(match):
return "*" * len(match.group(0))
def censored_string(cFilter, dirty):
clean = str(dirty)
wordList = cFilter.mutations.split(',')
wordList.sort(key = len)
wordList.reverse()
for swear_word in wordList:
target_word = swear_word.strip()
result = re.sub("(?i)\\b(("+target_word+"){1,})(s{0,1})\\b",replacement, clean)
clean = result
return clean
用于记录 - 这可以使用我的本地服务器设置,我可以确认也使用python 2.6.7和相同的django版本,但是我大约10个月前没有做过很多django或python并且继承了这个服务器设置最近 - 如果有什么我想念的地方请告诉我。
错误输出如下:
{
"error_message": "multiple repeat",
"traceback": ... "result = re.sub(\"(?i)\\\\b(\"+target_word+\"){1,}(s{0,1})\\\\b\",censored_word(target_word), clean)\n\n File \"/usr/lib/python2.6/re.py\", line 151, in sub\n return _compile(pattern, 0).sub(repl, string, count)\n\n File \"/usr/lib/python2.6/re.py\", line 245, in _compile\n raise error, v # invalid expression\n\nerror: multiple repeat\n"
}
我曾经尝试过和没有贪婪的人等等但现在迷失了 - 任何意见都会受到高度赞赏
欢呼声,
迈克尔
答案 0 :(得分:3)
我认为问题不在于正则表达式,而在于你的单词列表。该列表可能包含被解释为正则表达式特殊字符的字符。这对我有用:
#!/usr/bin/python
import re
def replacement(match):
return "*" * len(match.group(0))
def censored_string(dirty):
clean = str(dirty)
wordList = ["fuck", "shit", "damn"]
for swear_word in wordList:
target_word = swear_word.strip()
result = re.sub("(?i)\\b(("+target_word+"){1,})(s{0,1})\\b",replacement, clean)
clean = result
return clean
print censored_string("god damn i love bananas and fucking fuckfuck shits")
# god **** i love bananas and fucking ******** *****
答案 1 :(得分:1)
来自re
的“多次重复”错误字面意思是在模式中对同一个表达式应用了多个重复指令。
重复指令可以是*
,+
,?
,{m}
,{m,n}
等。如果多个指令适用于模式,你会得到那个错误。同样,target_word
最有可能包含您可能忘记逃避的正则表达式特殊字符。使用re.escape()
做到这一点然后再拍一次。
即
result = re.sub("(?i)\\b((" + re.escape(target_word) + "){1,})(s{0,1})\\b", replacement, clean)
答案 2 :(得分:0)
有人向Devy提出上述答案。
我自己的用例也是“re”和“Django”。
得到错误 - “在12号位置多次重复” 我的初始代码如下 -
str_7 = re.findall(r'([\d+]{1,20}[A-Z])',str_7)
## multiple repeat at position 12#
上面的错误---> (r'([\ d +] {1,20} - 不能同时拥有“\ d +”和{1,20}。
其他地方建议的re.escape
也不是理想的解决方案 - 尽量不要多于一个 - “重复指令”
因此,在我的情况下 - “加上算子”或“正面闭合”,不应该跟着“支撑算子”{m,n}