Найти - Пользователи
Полная версия: регулярные выражения
Начало » Python для экспертов » регулярные выражения
1 2
slivlen
используй нежадный поиск.
re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)
well
slivlen
используй нежадный поиск.
re.compile (r'<ztmc>.*?</ztmc>', re.IGNORECASE | re.DOTALL)
то есть вся проблема только в “жадном” поиске?
slivlen
well
то есть вся проблема только в “жадном” поиске?
Может быть. У меня нет тестовых данных чтоб это проверить. =)
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)
В этом же случае полный откат ничего не находит, т.к. закрывающий тег написан неправильно - обратный слеш вместо прямого. Далее регулярка ищет второй открывающий тег, а когда находит его, съедает всю строку до конца, а затем делает откат, пытаясь найти закрывающий и т.д… То есть все процессорное время уходит на перебор тегов.
well
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)
В этом же случае полный откат ничего не находит, т.к. закрывающий тег написан неправильно - обратный слеш вместо прямого. Далее регулярка ищет второй открывающий тег, а когда находит его, съедает всю строку до конца, а затем делает откат, пытаясь найти закрывающий и т.д… То есть все процессорное время уходит на перебор тегов.
ООО, спасибо, теперь понятнее стало :)
well
Всем привет! Возникла проблемка: надо по папке в винде пробежать и отсортировать файло. Проблема заключается в том, что в именах файлов есть русские символы. Делаю так:
# -*- 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
Может статейка поможет.
well
Ferroman
Может статейка поможет.
Как оказалось, не хватает re.UNICODE :). Спасибо.
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