Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2008 10:53:35

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

используй нежадный поиск.

re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)



Офлайн

#2 Март 28, 2008 13:37:51

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

slivlen
используй нежадный поиск.
re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)
то есть вся проблема только в “жадном” поиске?



Офлайн

#3 Март 28, 2008 15:58:35

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

well
то есть вся проблема только в “жадном” поиске?
Может быть. У меня нет тестовых данных чтоб это проверить. =)



Офлайн

#4 Март 28, 2008 17:24:11

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

регулярные выражения

Это хороший пример, подтверждающий, что жадный “.” следует использовать с большой осторожностью. Эта комбинация зажирает весь текст сразу до конца, правда, в зависимости от движка регулярки, в нее не будут попадать символы начала и конца строки, то есть, движок сожрет одну только строку (как это сделано, например, в питоне).
Но, SGML файлы, как правило, не содержат переводов строк, поэтому операция поиска по нему с использованием .* может занимать некоторое время.

well
re.compile (r“\<ztmc.*ztmc\>”, re.IGNORECASE)
В этом случае процедура довольно шустрая, т.к. проход строки один, плюс один небольшой откат.
При этом все теги ztmc будут найдены вместе с промежутками.
<ztmc> trallala </ztmc> … <ztmc> tralala </ztmc>
well
re.compile (r“\<ztmc\>.*\<\\ztmc\>”, re.IGNORECASE)
В этом же случае полный откат ничего не находит, т.к. закрывающий тег написан неправильно - обратный слеш вместо прямого. Далее регулярка ищет второй открывающий тег, а когда находит его, съедает всю строку до конца, а затем делает откат, пытаясь найти закрывающий и т.д… То есть все процессорное время уходит на перебор тегов.



Отредактировано (Март 28, 2008 17:26:51)

Офлайн

#5 Март 28, 2008 19:37:25

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

ZAN
Это хороший пример, подтверждающий, что жадный “.” следует использовать с большой осторожностью. Эта комбинация зажирает весь текст сразу до конца, правда, в зависимости от движка регулярки, в нее не будут попадать символы начала и конца строки, то есть, движок сожрет одну только строку (как это сделано, например, в питоне).
Но, SGML файлы, как правило, не содержат переводов строк, поэтому операция поиска по нему с использованием .* может занимать некоторое время.
well
re.compile (r"\<ztmc.*ztmc\>", re.IGNORECASE)
В этом случае процедура довольно шустрая, т.к. проход строки один, плюс один небольшой откат.
При этом все теги ztmc будут найдены вместе с промежутками.
<ztmc> trallala </ztmc> … <ztmc> tralala </ztmc>
well
re.compile (r"\<ztmc\>.*\<\\ztmc\>", re.IGNORECASE)
В этом же случае полный откат ничего не находит, т.к. закрывающий тег написан неправильно - обратный слеш вместо прямого. Далее регулярка ищет второй открывающий тег, а когда находит его, съедает всю строку до конца, а затем делает откат, пытаясь найти закрывающий и т.д… То есть все процессорное время уходит на перебор тегов.
ООО, спасибо, теперь понятнее стало :)



Отредактировано (Март 8, 2009 01:39:36)

Офлайн

#6 Сен. 4, 2008 19:07:07

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

Всем привет! Возникла проблемка: надо по папке в винде пробежать и отсортировать файло. Проблема заключается в том, что в именах файлов есть русские символы. Делаю так:

# -*- coding: utf-8 -*-
import os
import re
reg = re.compile (u"(V[0-9]{7}\.xls)|(сцп[0-9]*\.xls)", re.IGNORECASE)
files = os.listdir (path)
for i in files:
if reg.findall (u""+i.decode("cp1251")):
print i
“Англоязычные” файлы находит, а русские ну никак. Не подскажете, что не так?



Офлайн

#7 Сен. 4, 2008 21:41:22

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

регулярные выражения

Может статейка поможет.

Офлайн

#8 Сен. 8, 2008 10:33:46

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

регулярные выражения

Ferroman
Может статейка поможет.
Как оказалось, не хватает re.UNICODE :). Спасибо.



Отредактировано (Март 8, 2009 01:40:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version