2010-01-05 6 views
0

J'ai une page conçue dans Django qui a son propre moteur de recherche. Ce dont j'ai besoin d'aide est la construction de regex qui filtrera seulement les requêtes valides, qui sont composées seulement de lettres d'alphabet polonais (majuscules et minuscules) et de symboles * et? , quelqu'un peut-il être utile?Regex pour les requêtes de recherche

EDIT: Je essayé quelque chose comme ça:

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

mais elle permet aussi des caractères non valides de différents alphabets et permettra pas * somest * ing questions?.

+0

Que diriez-vous présenter un de vos démarches? Ou des extraits de code où vous avez essayé quelque chose? Cela serait utile ... –

+0

Mettez le \ w dans le [], et utilisez re.LOCALE au lieu de re.UNICODE. Ensuite, vous avez essentiellement le même regex que j'ai donné dans ma réponse ci-dessous. –

+0

Lorsque j'utilise re.LOCALE, les lettres polonaises ne sont pas valides, mais lorsque j'utilise re.UNICODE, elles sont valides, mais les lettres d'autres alphabets sont également valides, ainsi que les crochets [] et probablement plus. – Lhiash

Répondre

1

Essayez quelque chose comme

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

en supposant que les paramètres régionaux de votre machine est polonais. La première partie (? IL) définit le locale and ignorecase flags. Le^correspond au début de la chaîne, \ s correspond à tout espace, et a-z toute lettre minuscule (ou majuscule, grâce au drapeau ignorecase). Alternativement, au lieu d'utiliser (? L) et a-z, vous pouvez simplement lister explicitement les lettres autorisées (par exemple, abcdefghijklmnopqrstuvwxyz).

+0

Merci pour la réponse rapide. Malheureusement, cela ne fonctionne pas, les lettres polonaises sont toujours considérées comme invalides, les paramètres régionaux de la machine sont correctement définis. Getlocale renvoie: ('pl_PL', 'UTF8'). J'ai essayé les variantes a-z et aąbcćdeę ... mais toujours pas de chance. – Lhiash

2

Si votre locale est correctement réglée, vous devez utiliser

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

\w matchs tous les paramètres régionaux en caractères alphanumériques: http://docs.python.org/library/re.html

+0

A part utiliser \ w au lieu de a-z et séparer les drapeaux pour faire partie de la compilation au lieu de inline, en quoi est-ce différent de ma réponse? –

+1

l'utilisation probable de '\ w' au lieu de' [a-z] 'permet au moteur d'expressions rationnelles de tirer parti de la compréhension des paramètres régionaux de ce qu'est un caractère de mot? Si oui, c'est une bien meilleure réponse! – simon