2010-01-11 3 views
0

Cette question est liée à cette pile question de trop-plein:Comment puis-je prendre en charge * dans les chaînes de recherche définies par l'utilisateur en python?

How can I support wildcards in user-defined search strings in Python?

Mais je dois soutenir que les caractères génériques et non la? ou la fonctionnalité [seq] que vous obtenez avec fnmatch. Comme il n'y a aucun moyen de retirer cette fonctionnalité de fnmatch, y a-t-il une autre façon de faire?

je besoin d'une chaîne définie par l'utilisateur comme ceci: site.*.com/sub/
pour correspondre à ceci: site.hostname.com/sub/

Sans toutes les fonctionnalités supplémentaires de? et []

Répondre

3

Vous pouvez compiler une expression rationnelle à partir de votre chaîne de recherche en utilisant split, re.escape et '^ $'.

import re 
regex = re.compile('^' + '.*'.join(re.escape(foo) for foo in pattern.split('*')) + '$') 
+0

C'était parfait. J'essayais de trouver un moyen d'échapper à tous les petits morceaux de ré, mais je pensais que ce serait vraiment compliqué. – Robbie

1

Si son juste un astérisque et nécessitent la chaîne de recherche de représenter toute la chaîne trouvée, cela fonctionne:

searchstring = "site.*.com/sub/" 
to_match = "site.hostname.com/sub/" 

prefix, suffix = searchstring.split("*", 1) 

if to_match.startswith(prefix) and to_match.endswith(suffix): 
    print "Found a match!" 

Sinon, la construction d'une regex comme Tobu suggère est probablement le meilleur.

+0

Oui, c'est généré par l'utilisateur, donc je pourrais être n'importe quoi. – Robbie

Questions connexes