tsatur
Март 28, 2014 23:12:56
Здравствуйте. Никак не могу решить одну задачку. Имеется текст, начинающийся с заранее известного слова, пусть будет “Глава”. Текст может состоять из 2 и более строк, каждая из которых заканчивается символом переноса строки \n. Необходимо объединить строки в одну, при условии, что последующая строка содержит какие-либо символы, помимо переноса строки. Например, строка “Глава 1. Регулярные выражения \n в Python\n \n” должна превратиться в “Глава 1. Регулярные выражения в Python \n”.
Заранее благодарю!
py.user.next
Март 28, 2014 23:25:39
>>> 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'
>>>
tsatur
Март 28, 2014 23:33:56
А как насчет того, что строка должна начинаться со слова “Глава”, которое со всем содержимым, помимо \n, не должно удаляться?
Вывод такой же :)
py.user.next
Март 28, 2014 23:45:00
tsatur
А как насчет того, что строка должна начинаться со слова “Глава”
начало придётся отдельно искать
если совпадает с "^Глава" то
заменить переносы
конец если
tsatur
Вывод такой же
это мне показалось, да и всё равно он затратный (слишком много повторяющегося поиска)
tsatur
Март 28, 2014 23:47:04
Обидно. Я думал недокурил маны. Спасибо!
py.user.next
Март 28, 2014 23:52:01
его можно сделать, но он некрасивый и затратный
выполни import this, там правила, которых принято придерживаться
o7412369815963
Март 29, 2014 06:07:43
Это может подойти:
>>> 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 '
этот регкпс только частный случай решил, тут лучше “вручную”
py.user.next
Март 29, 2014 07:59:17
вот пример построения программы
dip3. plural exampleтам поиск и замена разделены
так сложный алгоритм разделяется на несколько простых, соединённых вместе
tsatur
Март 31, 2014 19:23:07
Спасибо всем за помощь, но решение задачи необходимо было построить именно на рег выражениях с заменой без предварительного поиска.
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'