Найти - Пользователи
Полная версия: Regexp, как остановить (.*) на первой попавлейся точке?
Начало » Python для новичков » Regexp, как остановить (.*) на первой попавлейся точке?
1 2
st00nsa
допустим у меня есть текст, он разделен на главы, структура такая:
Глава 13 Тайтл главы.
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Глава 14 Тайтл главы.
….
ну и так далее. Хочу выловить название главы . ее номер и ее текст.
пишу
re.compile("Глава (\d{1,5}) (.*)\.(.*)(?<=Глава)",   re.DOTALL|re.IGNORECASE )
но это явно не правильно потому что после первой (.*) он ищет не первую точку после текста а вообще последованию, как сделать правильно? буду рад ссылкам на туториалы по синтаксису регекспов (кроме интуита, офицальной доки и perlretut, их я уже просмотрел, если там есть ответ на мой вопрос то и их тоже давайте я мог пропустить).
Ferroman
Я так и не понял, что должен сделать регексп и чего он не делает.
st00nsa
в конце концов должен получиться массив где отедльно будут последовательно идти: номер главы, тайтл главы и ее содежимое. и так все главы.
Ferroman
Честно говоря, регексп как-то усложнён, к тому же, я рекомендую разбить его на именованные группы.
>>> text = """Глава 13 Тайтл главы. dfnfbfbfbfbfbfbbf """
>>> rg = r'Глава\ (?P<num>\d{2})(?P<title>.*)\.'
>>> num_re = re.compile(rg)
>>> print num_re.findall(text)[0][0]
13
>>> print num_re.findall(text)[0][1]
Тайтл главы
Дальше сам.
st00nsa
до таких простых вещей я добрался, конечно спасибо за то что вы назвали группы, но у меня проблема в том что я не знаю как остановить (.*) перед следующей Главой, и еще важное что файл много строчный, на одной строке то все проще. но все равно спасибо за внинмание.
Ferroman
Так в чём проблема-то?
st00nsa
вот в этом)
>>> import re
>>> text = """Глава 13 Тайтл главы.
... Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
... Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
... Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
... Глава 14 Тайтл главы.
... .... """
>>> prog = re.compile("Глава (\d{1,5}) (.*)\.", re.DOTALL|re.IGNORECASE )
>>> result = prog.findall(text)
>>> result[0][0]
'13'
>>> print result[0][1]
Тайтл главы.
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Глава 14 Тайтл главы.
...
я хочу отдельно тайтл главы, отдельно текст, и далее следующую главу так же)
Ferroman
Что надо, я понял. Я не могу понять в чём проблема так сделать.
Надо несколько строк? Есть re.MULTILINE. В остальном не вижу препятствий. Ну не давать же вам готовую регулярку, в самом деле.
Nik
p = re.compile(r"Глава (\d{1,5}) (.*?)\.(.*?)(?=(Глава)|$)", re.S | re.I)
pasaranax
(.*?)
то бишь, утоляешь жадность звездочки вопросиком
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