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}などです。これらの 2 つ以上がパターンに適用されると、そのエラーが発生します。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 に答える