2012-05-03 30 views
0

我想添加一個更有效的發誓過濾器到我們有的聊天服務,似乎無法讓我的正則表達式工作在我的活Django服務器。Django/Python使用正則表達式獲取「error_message」:「多個重複」

我正在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的版本,但我沒有做太多django或python,大約10個月前,最近繼承了這個服務器設置 - 如果有什麼我不見了,請告訴我。

錯誤的輸出如下:

{ 
    "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" 
} 

我曾嘗試與不貪婪的等等,但現在我失去了 - 任何輸入將不勝感激

歡呼聲,

邁克爾

回答

2

我不認爲問題是與正則表達式,但與您的單詞列表。該列表可能包含被解釋爲正則表達式特殊字符的字符。這個工作對我來說:

#!/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 ******** ***** 
+0

輝煌 - 我剛剛嘗試了一個硬編碼列表,它工作。非常感謝你:) –

+1

難道這不是真的是'上帝****我愛香蕉和**** ing ******** *****'? –

+0

你可能會有這種看法,但這不是正則表達式所說的。 OP可以發佈另一個問題的幫助;) – beerbajay

1

上重新LIB「多重複」錯誤的字面意思是有你的模式應用到相同的表達多於一個重複的指令。

重複指令可以是'*','+','?',{m},{m,n}等。如果多於一個應用於某個模式,那麼您會發生該錯誤。同樣,最有可能的是你的target_word包含你可能忘記逃脫的正則表達式特殊字符。使用re.escape()來做到這一點,並給它另一個鏡頭。

I.E. (s(0,1)){b,(「+ re.escape(target_word)+」){1,})(s {0,1})\ b「,替換,清理)

希望有幫助。

+0

它確實有幫助 - thankyou :) –

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其他地方建議是不理想的解決方案 - 儘量不要有超過一個 - 「重複指令」

因此在我的情況 - 「加算子」或「正閉包」,不應該後面跟着「Brace Operator」{m,n}