Django / Python使用正则表达式获取“error_message”:“多次重复”

时间:2012-05-03 08:38:46

标签: python regex django

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

我曾经尝试过和没有贪婪的人等等但现在迷失了 - 任何意见都会受到高度赞赏

欢呼声,

迈克尔

3 个答案:

答案 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}