Python: регулярное выражение словаря с использованием подстановочных знаков пользовательского ввода

Я хотел бы иметь возможность искать словарь в Python, используя подстановочные знаки пользовательского ввода.

Я нашел это:

import fnmatch
lst = ['this','is','just','a','test', 'thing']
filtered = fnmatch.filter(lst, 'th*')

Это соответствует этому и тому подобному. Теперь, если я попытаюсь ввести весь файл и выполнить поиск по

with open('testfilefolder/wssnt10.txt') as f:
 file_contents = f.read().lower()
 filtered = fnmatch.filter(file_contents, 'th*')

это ни с чем не совпадает. Разница в том, что в файле, который я читаю, я текстовый файл (пьеса Шекспира), поэтому у меня есть пробелы, а не список. Я могу сопоставить такие вещи, как одна буква, поэтому, если у меня есть только «т», я получаю кучу «т». Итак, это говорит мне, что я сопоставляю отдельные буквы - однако я хочу сопоставлять целые слова - но даже больше, чтобы сохранить структуру подстановочных знаков.

Поскольку я хотел бы, чтобы пользователь ввел текст (включая то, что будет подстановочным знаком), я могу заменить его на место, где находится «th *». Дикая карта будет делать то, что она должна делать до сих пор. Это приводит к вопросу, могу ли я просто вставить переменную, содержащую текст поиска, для «th *»? После некоторого расследования мне интересно, должен ли я как-то перевести, например, «th *», и нашел что-то вроде:

regex = fnmatch.translate('th*')
print(regex)

который выводит th.*\Z(?ms)

Это правильный способ сделать это? Я не знаю, нужно ли это.

Как лучше всего было бы «передавать формулы регулярных выражений», а также, возможно, понять, что у меня не так в коде, поскольку он не работает со строкой входящего текста во втором наборе кода, как это происходит ( правильно) в первую.


person Relative0    schedule 04.04.2013    source источник
comment
Почему бы вам просто не использовать re?   -  person n1xx1    schedule 05.04.2013


Ответы (1)


Если проблема только в том, что у вас «есть пробелы, а это не список», почему бы не превратить это в список?

with open('testfilefolder/wssnt10.txt') as f:
 file_contents = f.read().lower().split(' ') # split line on spaces to make a list
 filtered = fnmatch.filter(file_contents, 'th*')
person Chris    schedule 04.04.2013
comment
Спасибо за это Крис. Сначала я пытаюсь научиться писать эти вещи на Python (я довольно новичок), но даже не уверен, стоит ли мне это делать в конце концов, поскольку я собираюсь объединять тысячи файлов. Списки звучат хорошо для меня, мне любопытно узнать, лучший ли это вариант. Спасибо еще раз, - person Relative0; 05.04.2013