Форум сайта python.su
0
Если работать с большими текстовыми файлами - схема (?=.*(…))(?=.*(…)) как оператор “И” для поиска 2 слов работает ЖУТКО долго и нагрузка на процессор под 100%. Гораздо быстрее если разделить регулярное выражение на 2 разных и питоновским “and” проверить оба ли слова присутствуют. Но если искать нужно не 1 парy слов, а несколько - всё это дело очень некрасиво выглядеть будет.
Вопрос - как это всё обьединить в одно выражение и чтоб работало БЫСТРО?
Отредактировано alexiy (Янв. 29, 2014 11:22:03)
Офлайн
253
напишите конкретно как вы ищете. Проверка вхождения слов делается как
"you_word" in "some long string"
def is_in(s): for i in "re1 re2".split(): if not re.search(i,s): return 0 return 1 is_in("some long string")
Офлайн
47
пара слов ищется так
r"\bslovo1\s+slovo2\b"
Отредактировано bismigalis (Янв. 29, 2014 18:18:38)
Офлайн
0
kise97
Использовать re.compile
Офлайн
0
doza_and
напишите конкретно как вы ищете. Проверка вхождения слов делается как
“you_word” in “some long string”
Не вижу причин чтобы не использовать цикл.
def is_in(s):
for i in “re1 re2”.split():
if not re.search(i,s):
return 0
return 1
is_in(“some long string”)
Если это просто слова - то может лучше из исходных данных сделать set?
Офлайн
0
bismigalis
пара слов ищется так
r“\bslovo1\s+slovo2\b”
Офлайн
857
alexiyнужен пример текста и слов, которые в нём надо найти
Гораздо быстрее если разделить регулярное выражение на 2 разных и питоновским “and” проверить оба ли слова присутствуют.
Офлайн
253
alexiyрегулярки довольно быстрая штука, но надо понимать что это конечные автоматы. Их можно оптимизировать. Например: http://habrahabr.ru/post/117177/ Смысл в том чтобы не повторять проходы по строке и по возможности не возвращаться назад. Вот у вас похоже есть порядок в котором встречаются выражения. Тогда например можете использовать приложенный модуль после небольшой модификации.
Первым ищется MD5 по шаблону, и вторым “md5|hash”.
itr=ReIter("a.dat") a=itr.search("md5") b=itr.search("md5|hash")
Прикреплённый файлы:
re_iter.py (3,2 KБ)
Офлайн
0
doza_and
Этот итератор ищет последовательно начиная с последнего найденного выражения. Одновременно используется только одно выражение.
Офлайн