Найти - Пользователи
Полная версия: RegExp operator AND
Начало » Python для новичков » RegExp operator AND
1 2
alexiy
Если работать с большими текстовыми файлами - схема (?=.*(…))(?=.*(…)) как оператор “И” для поиска 2 слов работает ЖУТКО долго и нагрузка на процессор под 100%. Гораздо быстрее если разделить регулярное выражение на 2 разных и питоновским “and” проверить оба ли слова присутствуют. Но если искать нужно не 1 парy слов, а несколько - всё это дело очень некрасиво выглядеть будет.

Вопрос - как это всё обьединить в одно выражение и чтоб работало БЫСТРО?
kise97
Использовать re.compile
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?
bismigalis
пара слов ищется так

r"\bslovo1\s+slovo2\b"
alexiy
kise97
Использовать re.compile

Почти ничего не меняет, всего пару процентов разница. Возможно из-за работы с файлами
alexiy
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?

Это не просто слова к сожалению. Первым ищется MD5 по шаблону, и вторым “md5|hash”. Цикл да, немного упростит визуальное восприятие, но всёравно в “re1 re2”.split() будет порядком много всего. А как обычно делается, когда сложные схемы поиска с операторами И и ИЛИ и их комбинациями?
alexiy
bismigalis
пара слов ищется так

r“\bslovo1\s+slovo2\b”

..это уже получше выглядит и что-то новенькое. Посмотрю как у такой формы дела со скоростью и нагрузкой
py.user.next
alexiy
Гораздо быстрее если разделить регулярное выражение на 2 разных и питоновским “and” проверить оба ли слова присутствуют.
нужен пример текста и слов, которые в нём надо найти
doza_and
alexiy
Первым ищется MD5 по шаблону, и вторым “md5|hash”.
регулярки довольно быстрая штука, но надо понимать что это конечные автоматы. Их можно оптимизировать. Например: http://habrahabr.ru/post/117177/ Смысл в том чтобы не повторять проходы по строке и по возможности не возвращаться назад. Вот у вас похоже есть порядок в котором встречаются выражения. Тогда например можете использовать приложенный модуль после небольшой модификации.
itr=ReIter("a.dat")
a=itr.search("md5")
b=itr.search("md5|hash")
md5 и md5|hash замените на ваши регулярные выражения. Этот итератор ищет последовательно начиная с последнего найденного выражения. Одновременно используется только одно выражение.
alexiy
doza_and
Этот итератор ищет последовательно начиная с последнего найденного выражения. Одновременно используется только одно выражение.

Могут быть в разном порядке слова - и “489f6d489f679b489f6489f62e3e489f61 = md5” и “hash is 489f6489f6489f6489f6489f6489f6489f6;”
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB