Форум сайта python.su
допустим у меня есть текст, он разделен на главы, структура такая:
Глава 13 Тайтл главы.
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Глава 14 Тайтл главы.
….
ну и так далее. Хочу выловить название главы . ее номер и ее текст.
пишу
re.compile("Глава (\d{1,5}) (.*)\.(.*)(?<=Глава)", re.DOTALL|re.IGNORECASE )
Офлайн
Я так и не понял, что должен сделать регексп и чего он не делает.
Офлайн
в конце концов должен получиться массив где отедльно будут последовательно идти: номер главы, тайтл главы и ее содежимое. и так все главы.
Офлайн
Честно говоря, регексп как-то усложнён, к тому же, я рекомендую разбить его на именованные группы.
>>> 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]
Тайтл главы
Офлайн
до таких простых вещей я добрался, конечно спасибо за то что вы назвали группы, но у меня проблема в том что я не знаю как остановить (.*) перед следующей Главой, и еще важное что файл много строчный, на одной строке то все проще. но все равно спасибо за внинмание.
Офлайн
Так в чём проблема-то?
Офлайн
вот в этом)
>>> 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 Тайтл главы.
...
Отредактировано (Янв. 21, 2010 00:05:12)
Офлайн
Что надо, я понял. Я не могу понять в чём проблема так сделать.
Надо несколько строк? Есть re.MULTILINE. В остальном не вижу препятствий. Ну не давать же вам готовую регулярку, в самом деле.
Офлайн
p = re.compile(r"Глава (\d{1,5}) (.*?)\.(.*?)(?=(Глава)|$)", re.S | re.I)
Офлайн
(.*?)
то бишь, утоляешь жадность звездочки вопросиком
Офлайн