Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2010 19:08:20

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

допустим у меня есть текст, он разделен на главы, структура такая:
Глава 13 Тайтл главы.
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Текст Текст Текст Текст Текст Текст Текст Текст Текст Текст
Глава 14 Тайтл главы.
….
ну и так далее. Хочу выловить название главы . ее номер и ее текст.
пишу

re.compile("Глава (\d{1,5}) (.*)\.(.*)(?<=Глава)",   re.DOTALL|re.IGNORECASE )
но это явно не правильно потому что после первой (.*) он ищет не первую точку после текста а вообще последованию, как сделать правильно? буду рад ссылкам на туториалы по синтаксису регекспов (кроме интуита, офицальной доки и perlretut, их я уже просмотрел, если там есть ответ на мой вопрос то и их тоже давайте я мог пропустить).



Офлайн

#2 Янв. 20, 2010 21:17:15

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

Regexp, как остановить (.*) на первой попавлейся точке?

Я так и не понял, что должен сделать регексп и чего он не делает.

Офлайн

#3 Янв. 20, 2010 21:21:54

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

в конце концов должен получиться массив где отедльно будут последовательно идти: номер главы, тайтл главы и ее содежимое. и так все главы.



Офлайн

#4 Янв. 20, 2010 21:56:37

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

Regexp, как остановить (.*) на первой попавлейся точке?

Честно говоря, регексп как-то усложнён, к тому же, я рекомендую разбить его на именованные группы.

>>> 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]
Тайтл главы
Дальше сам.

Офлайн

#5 Янв. 20, 2010 22:42:12

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

до таких простых вещей я добрался, конечно спасибо за то что вы назвали группы, но у меня проблема в том что я не знаю как остановить (.*) перед следующей Главой, и еще важное что файл много строчный, на одной строке то все проще. но все равно спасибо за внинмание.



Офлайн

#6 Янв. 20, 2010 23:24:26

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

Regexp, как остановить (.*) на первой попавлейся точке?

Так в чём проблема-то?

Офлайн

#7 Янв. 21, 2010 00:04:24

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

вот в этом)

>>> 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)

Офлайн

#8 Янв. 21, 2010 00:20:51

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

Regexp, как остановить (.*) на первой попавлейся точке?

Что надо, я понял. Я не могу понять в чём проблема так сделать.
Надо несколько строк? Есть re.MULTILINE. В остальном не вижу препятствий. Ну не давать же вам готовую регулярку, в самом деле.

Офлайн

#9 Янв. 21, 2010 00:50:31

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

p = re.compile(r"Глава (\d{1,5}) (.*?)\.(.*?)(?=(Глава)|$)", re.S | re.I)



Офлайн

#10 Янв. 21, 2010 01:11:17

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Regexp, как остановить (.*) на первой попавлейся точке?

(.*?)
то бишь, утоляешь жадность звездочки вопросиком



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version