Как я могу создать условия поиска с подстановочными знаками в Python?

#python #wildcard

#python #подстановочный знак

Вопрос:

Я хочу проверить, содержится ли определенный термин в документе. Однако иногда слово имеет несколько форм (множественное число, прошедшее время и т.д.).

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

Как я могу создать условие поиска, которое будет находить все экземпляры, такие как

 '*ello* World*'
  

где звезда — это подстановочный знак, который не обязательно должен быть включен в word.

Я нашел документацию для модуля fnmatch, но я не вижу, как это может помочь мне выполнить поиск по документу.

Комментарии:

1. Похоже, вам может понадобиться word stemming или что-то в NLTK…

Ответ №1:

Используйте регулярные выражения и просто просматривайте файл:

 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()
  

Ответ №2:

Обычно я бы выбрал регулярное выражение, но если по какой-то причине вы хотите придерживаться формата подстановочных знаков, вы можете сделать это:

 from fnmatch import fnmatch

pattern = '*ello* World*'

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

Комментарии:

1. «Регулярные выражения обычно лучше». Да, ну … это похоже на твое мнение, чувак. хаха, я бы сказал, что они лучше, когда вы ищете что-то очень точное, где подстановочные знаки не могут работать. Для всего остального подстановочные знаки, вероятно, лучше. Проще в изучении, легче в написании и проще в обслуживании. Но, эй… Это похоже на мое мнение, чувак … 🙂

2. Вы правильно подметили! Я отредактировал сообщение, чтобы смягчить свое мнение.

Ответ №3:

Описанный вами синтаксис * известен как глобализация. Это не работает для документов, только для файлов и каталогов. Регулярные выражения, как отмечали другие, являются ответом.

Комментарии:

1. За исключением существования fnmatch .

2. согласно документам , fnmatch предназначен для использования с именами файлов.

3. Он очень часто использует «filename» в качестве аргумента, но нигде не сказано, что это только для использования с именами файлов.

4. После небольшой игры, кажется, это сработает, если вы начнете и закончите свой шаблон с *

Ответ №4:

Если вы делаете что-то сложное, вам подойдут регулярные выражения. Если вас это не устраивает, я думаю, что для вашего конкретного вопроса вы также могли бы использовать «in». Например:

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

Ответ №5:

можете ли вы использовать регулярное выражение?

 import re
m = re.search('.*ello', somefile)
  

подробнее здесь:

http://docs.python.org/library/re.html