Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2014 11:11:58

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

RegExp operator AND

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

Вопрос - как это всё обьединить в одно выражение и чтоб работало БЫСТРО?

Отредактировано alexiy (Янв. 29, 2014 11:22:03)

Офлайн

#2 Янв. 29, 2014 11:55:21

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

RegExp operator AND

Использовать re.compile

Офлайн

#3 Янв. 29, 2014 17:44:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

RegExp operator 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?



Офлайн

#4 Янв. 29, 2014 18:12:27

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

RegExp operator AND

пара слов ищется так

r"\bslovo1\s+slovo2\b"

Отредактировано bismigalis (Янв. 29, 2014 18:18:38)

Офлайн

#5 Янв. 29, 2014 20:56:20

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

RegExp operator AND

kise97
Использовать re.compile

Почти ничего не меняет, всего пару процентов разница. Возможно из-за работы с файлами

Офлайн

#6 Янв. 29, 2014 21:02:06

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

RegExp operator AND

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() будет порядком много всего. А как обычно делается, когда сложные схемы поиска с операторами И и ИЛИ и их комбинациями?

Офлайн

#7 Янв. 29, 2014 21:04:55

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

RegExp operator AND

bismigalis
пара слов ищется так

r“\bslovo1\s+slovo2\b”

..это уже получше выглядит и что-то новенькое. Посмотрю как у такой формы дела со скоростью и нагрузкой

Офлайн

#8 Янв. 29, 2014 21:22:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

RegExp operator AND

alexiy
Гораздо быстрее если разделить регулярное выражение на 2 разных и питоновским “and” проверить оба ли слова присутствуют.
нужен пример текста и слов, которые в нём надо найти



Офлайн

#9 Янв. 30, 2014 06:34:18

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

RegExp operator 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 замените на ваши регулярные выражения. Этот итератор ищет последовательно начиная с последнего найденного выражения. Одновременно используется только одно выражение.



Прикреплённый файлы:
attachment re_iter.py (3,2 KБ)

Офлайн

#10 Янв. 30, 2014 09:40:13

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

RegExp operator AND

doza_and
Этот итератор ищет последовательно начиная с последнего найденного выражения. Одновременно используется только одно выражение.

Могут быть в разном порядке слова - и “489f6d489f679b489f6489f62e3e489f61 = md5” и “hash is 489f6489f6489f6489f6489f6489f6489f6;”

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version