#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)
подробнее здесь: