2010-01-05 4 views
0

У меня есть страница, разработанная в Django, которая имеет собственную поисковую систему. Мне нужна помощь в построении регулярного выражения, которое будет фильтровать только действительные запросы, которые состоят только из букв латинского алфавита (как верхнего, так и нижнего регистра) и символов * и? , может ли кто-нибудь помочь?Регулярное выражение для поисковых запросов

EDIT: Я пытался что-то вроде этого:

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

но также допускает некоторые недопустимые символы из различных алфавитов и не позволит * somest ИНГ * запросы?.

+0

Как о представлении одного из ваших подходов? Или некоторые фрагменты кода, где вы что-то пробовали? Это было бы полезно ... –

+0

Поместите \ w внутри [] и используйте re.LOCALE вместо re.UNICODE. Тогда у вас есть по существу то же самое регулярное выражение, которое я дал в моем ответе ниже. –

+0

Когда я использую re.LOCALE, польские буквы недействительны, но когда я использую re.UNICODE, они действительны, но буквы из других алфавитов также являются допустимыми, а также скобки '[]' и, возможно, больше. – Lhiash

ответ

1

Try что-то вроде

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

2

Если локаль правильно, вы будете использовать

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

\w матчи всех локалей: латинские буквы и цифры http://docs.python.org/library/re.html

+0

За исключением использования \ w вместо a-z и разделения флагов на часть компиляции вместо встроенного, как это отличается от моего ответа? –

+1

предположительно используя '\ w' вместо' [a-z] 'позволяет механизму регулярных выражений использовать язык для понимания того, что является символом слова? Если это так, это гораздо лучший ответ! – simon

Смежные вопросы