2010-01-05 75 views
0

我有設計在Django中的頁面,它有自己的搜索引擎。我需要幫助的是構造正則表達式,它只會過濾僅包含波蘭語字母(大寫和小寫)和符號*和? ,任何人都可以提供幫助嗎?用於搜索查詢的正則表達式

編輯: 我想類似的東西:

query_re = re.compile(r'^\w*[\*\?]*$', re.UNICODE) 
if not query_re.match(self.cleaned_data['query']): 
    raise forms.ValidationError(_('Illegal character')) 

,但它也允許從不同的字母一些無效字符,並且不會允許* somest荷蘭國際集團*查詢?

+0

如何呈現你的做法嗎?或者你嘗試過什麼的一些代碼片段?這將有所幫助... – 2010-01-05 19:21:26

+0

將\ w放在[]內,並使用re.LOCALE而不是re.UNICODE。然後你在我的答案中給出了基本相同的正則表達式。 – 2010-01-05 19:36:59

+0

當我使用re.LOCALE波蘭字母是無效的,但是當我使用re.UNICODE他們是有效的,但來自其他字母的字母也是有效的以及括號'[]',可能更多。 – Lhiash 2010-01-05 19:49:11

回答

1

嘗試像

regex = r'(?iL)^[\s\*\?a-z]*$' 

假設你的機器的語言環境是波蘭。第一部分(?iL)設置locale and ignorecase flags。 ^匹配字符串的開頭,\ s匹配任何空格,並且a-z任意小寫字母(或大寫,由於ignorecase標誌)。

或者,也可以不使用(?L)和a-z,而是明確列出允許的字母(例如abcdefghijklmnopqrstuvwxyz)。

+0

感謝您的迅速回復。不幸的是,這不起作用,波蘭字母仍然被認爲是無效的,機器語言環境設置正確getlocale返回:('pl_PL','UTF8')。我嘗試了a-z和aąbcćdeę...變體,但仍然沒有運氣。 – Lhiash 2010-01-05 19:44:09

2

如果你的語言環境設置是否正確,你可以使用

query_re = re.compile(r'^[\w\*\?]*$', re.LOCALE|re.IGNORECASE) 

\w比賽的所有區域設置特定的字母數字:http://docs.python.org/library/re.html

+0

除了使用\ w而不是a-z並將標誌拆分爲編譯的一部分而不是內聯,這與我的回答有什麼不同? – 2010-01-05 22:41:40

+1

推測使用'\ w'而不是'[a-z]'允許正則表達式引擎利用locale對什麼是單詞字符的理解?如果是這樣,這是一個更好的答案! – simon 2011-05-02 06:33:29