2011-04-27 5 views
4

Je veux vérifier si un certain terme est contenu dans un document. Cependant, parfois, le mot est sous plusieurs formes (pluriel, passé, etc.).Comment créer des termes de recherche avec des caractères génériques dans Python?

'Hello Worlds' 
'Hellos Worlds' 
'Jello World' 
'Hello Worlded' 

Comment puis-je créer un terme de recherche qui trouvera tous les cas tels que

'*ello* World*' 

où étoiles est une carte sauvage qui ne doit pas nécessairement être inclus dans le mot.

J'ai trouvé la documentation pour un module fnmatch, mais je ne vois pas comment cela peut m'aider à faire une recherche dans un document.

+0

On dirait que vous voudrez peut-être un radical de mot ou d'une Trucs NLTK ... – Daenyth

Répondre

6

Utilisez des expressions régulières et boucle juste à travers le fichier:

import re 
f=open('test.file.here', 'r') 

pattern = re.compile("^[^\s]*ello[^\s]*\sWorld[^\s]*$") 

for line in f: 
    if pattern.match(line): 
    print line, 

f.close() 
+0

Merci beaucoup @photoionized. Ceci est exactement ce que je cherchais. – coderman

3

Le * vous décrivez est syntaxe que connue sous le nom globbing. Cela ne fonctionne pas pour les documents, seulement les fichiers et les répertoires. Les expressions régulières, comme d'autres l'ont noté, sont la réponse.

+1

Excepté l'existence de 'fnmatch'. –

+1

Selon le document [docs] (http://docs.python.org/library/fnmatch.html), fnmatch est destiné à être utilisé sur les noms de fichiers. –

+0

Il utilise énormément "filename" comme un argument, mais il ne dit nulle part que c'est * seulement * pour une utilisation sur les noms de fichiers. –

2

Si vous faites quelque chose de compliqué, les expressions régulières sont la voie à suivre. Si vous n'êtes pas à l'aise avec ceux-ci, je pense que pour votre question spécifique, vous pouvez également utiliser "in". Par exemple:

x = 'hello world' 
if 'ello' in x and 'world' in x': 
    print 'matches' 
else: 
    print 'does not match' 
1

Les expressions régulières sont généralement mieux, mais si pour une raison quelconque vous voulez coller au format générique, vous pouvez le faire:

from fnmatch import fnmatch 

pattern = '*ello* World*' 

with open('sample.txt') as file: 
    for line in f: 
     if fnmatch(line, pattern): 
      print(line) 
Questions connexes