Форум сайта python.su
используй нежадный поиск.
re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)
Офлайн
slivlenто есть вся проблема только в “жадном” поиске?
используй нежадный поиск.re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)
Офлайн
wellМожет быть. У меня нет тестовых данных чтоб это проверить. =)
то есть вся проблема только в “жадном” поиске?
Офлайн
Это хороший пример, подтверждающий, что жадный “.” следует использовать с большой осторожностью. Эта комбинация зажирает весь текст сразу до конца, правда, в зависимости от движка регулярки, в нее не будут попадать символы начала и конца строки, то есть, движок сожрет одну только строку (как это сделано, например, в питоне).
Но, SGML файлы, как правило, не содержат переводов строк, поэтому операция поиска по нему с использованием .* может занимать некоторое время.
wellВ этом случае процедура довольно шустрая, т.к. проход строки один, плюс один небольшой откат.
re.compile (r“\<ztmc.*ztmc\>”, re.IGNORECASE)
wellВ этом же случае полный откат ничего не находит, т.к. закрывающий тег написан неправильно - обратный слеш вместо прямого. Далее регулярка ищет второй открывающий тег, а когда находит его, съедает всю строку до конца, а затем делает откат, пытаясь найти закрывающий и т.д… То есть все процессорное время уходит на перебор тегов.
re.compile (r“\<ztmc\>.*\<\\ztmc\>”, re.IGNORECASE)
Отредактировано (Март 28, 2008 17:26:51)
Офлайн
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)
Офлайн
Всем привет! Возникла проблемка: надо по папке в винде пробежать и отсортировать файло. Проблема заключается в том, что в именах файлов есть русские символы. Делаю так:
# -*- 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
Офлайн
Может статейка поможет.
Офлайн
FerromanКак оказалось, не хватает re.UNICODE :). Спасибо.
Может статейка поможет.
Отредактировано (Март 8, 2009 01:40:39)
Офлайн