Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2014 23:12:56

tsatur
От:
Зарегистрирован: 2011-05-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Здравствуйте. Никак не могу решить одну задачку. Имеется текст, начинающийся с заранее известного слова, пусть будет “Глава”. Текст может состоять из 2 и более строк, каждая из которых заканчивается символом переноса строки \n. Необходимо объединить строки в одну, при условии, что последующая строка содержит какие-либо символы, помимо переноса строки. Например, строка “Глава 1. Регулярные выражения \n в Python\n \n” должна превратиться в “Глава 1. Регулярные выражения в Python \n”.
Заранее благодарю!



Офлайн

#2 Март 28, 2014 23:25:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

Регулярные выражения

>>> import re
>>> 
>>> s = 'Глава 1. Регулярные выражения \n в Python\n \n'
>>> 
>>> out = re.sub(r'\n(?=.)', r'', s)
>>> out
'Глава 1. Регулярные выражения  в Python \n'
>>>

это получше
>>> import re
>>> 
>>> s = 'Глава 1. Регулярные выражения \n\n в Python\n \n\n'
>>> 
>>> out = re.sub(r'\n(?!\Z)', r'', s, re.S)
>>> out
'Глава 1. Регулярные выражения  в Python \n'
>>>



Отредактировано py.user.next (Март 28, 2014 23:43:41)

Офлайн

#3 Март 28, 2014 23:33:56

tsatur
От:
Зарегистрирован: 2011-05-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

А как насчет того, что строка должна начинаться со слова “Глава”, которое со всем содержимым, помимо \n, не должно удаляться?

Вывод такой же :)



Отредактировано tsatur (Март 28, 2014 23:44:00)

Офлайн

#4 Март 28, 2014 23:45:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

Регулярные выражения

tsatur
А как насчет того, что строка должна начинаться со слова “Глава”
начало придётся отдельно искать

если совпадает с "^Глава" то
заменить переносы
конец если

tsatur
Вывод такой же
это мне показалось, да и всё равно он затратный (слишком много повторяющегося поиска)



Отредактировано py.user.next (Март 28, 2014 23:48:17)

Офлайн

#5 Март 28, 2014 23:47:04

tsatur
От:
Зарегистрирован: 2011-05-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Обидно. Я думал недокурил маны. Спасибо!



Офлайн

#6 Март 28, 2014 23:52:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

Регулярные выражения

его можно сделать, но он некрасивый и затратный
выполни import this, там правила, которых принято придерживаться



Офлайн

#7 Март 29, 2014 06:07:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения

Это может подойти:

>>> s = 'Глава 1. Регулярные выражения \n\n в Python\n \n\n Глава 1. Регулярные выражения \n\n в Python\n \n\n Глава 1. Регулярные выражения \n\n в Python\n \n\n '
>>> '\nГлава'.join(s.replace('\n', '').split('Глава')).lstrip()
'Глава 1. Регулярные выражения  в Python  \nГлава 1. Регулярные выражения  в Python  \nГлава 1. Регулярные выражения  в Python  '

>>> s = 'Глава 1. Регулярные выражения \n\n в Python\n \n\nГлава 2. Регулярные выражения \n\n в Python\n \n\nГлава 3. Регулярные выражения \n\n в Python\n \n\n '
>>> re.sub('\n[^( *Глава)]', '', s)
'Глава 1. Регулярные выражения  в Python\n Глава 2. Регулярные выражения  в Python\n Глава 3. Регулярные выражения  в Python\n  '
этот регкпс только частный случай решил, тут лучше “вручную”

Отредактировано o7412369815963 (Март 29, 2014 06:25:21)

Офлайн

#8 Март 29, 2014 07:59:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

Регулярные выражения

вот пример построения программы
dip3. plural example

там поиск и замена разделены
так сложный алгоритм разделяется на несколько простых, соединённых вместе



Отредактировано py.user.next (Март 29, 2014 08:03:03)

Офлайн

#9 Март 31, 2014 19:23:07

tsatur
От:
Зарегистрирован: 2011-05-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Спасибо всем за помощь, но решение задачи необходимо было построить именно на рег выражениях с заменой без предварительного поиска.
3 часа мучений и я добился. Может быть громоздко, но условия усложнились. Может кому понадобится.

patt = re.compile(r'(^Глава.*)\n([а-я, ]+)*\n*([а-я, ]+)*', re.MULTILINE)
law_text = re.sub(patt, check_article_title, law_text)
def check_article_title(title):
    if title.group(3):
        return '\n' + title.group(1) + ' ' + title.group(2) + ' ' + title.group(3)
    if title.group(2):
        return '\n' + title.group(1) + ' ' + title.group(2) + '\n'
    return '\n' + title.group(1) + '\n'



Отредактировано tsatur (Март 31, 2014 19:23:58)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version