0

我正在尝试向我们拥有的聊天服务添加更有效的发誓过滤器,但似乎无法让我的正则表达式在我的实时 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"
}

我尝试过有无贪心等等,但现在迷路了 - 任何输入将不胜感激

干杯,

迈克尔

4

3 回答 3

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 ******** *****
于 2012-05-03T09:03:07.023 回答
1

从字面上看,“多次重复”错误re意味着有多个重复指令应用于您的模式中的同一表达式。

重复指令可以是*, +, ?, {m},{m,n}等。如果将多个这些指令应用于一个模式,您将收到该错误。同样,它很可能target_word包含您可能忘记转义的正则表达式特殊字符。用re.escape()它来做到这一点,再给它一次机会。

IE

result = re.sub("(?i)\\b((" + re.escape(target_word) + "){1,})(s{0,1})\\b", replacement, clean)
于 2012-05-10T18:23:42.180 回答
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+" AND {1,20} ,两者都在一起。

同样re.escape正如其他地方所建议的那样,这不是理想的解决方案 - 尽量不要有多个 - “重复指令”

因此,在我的情况下 - "加号运算符" 或 "正闭包" 不应跟在 "大括号运算符" {m,n}

于 2017-10-27T08:21:21.807 回答