Форум сайта python.su
Здравствуйте. Никак не могу решить одну задачку. Имеется текст, начинающийся с заранее известного слова, пусть будет “Глава”. Текст может состоять из 2 и более строк, каждая из которых заканчивается символом переноса строки \n. Необходимо объединить строки в одну, при условии, что последующая строка содержит какие-либо символы, помимо переноса строки. Например, строка “Глава 1. Регулярные выражения \n в Python\n \n” должна превратиться в “Глава 1. Регулярные выражения в Python \n”.
Заранее благодарю!
Офлайн
>>> 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)
Офлайн
А как насчет того, что строка должна начинаться со слова “Глава”, которое со всем содержимым, помимо \n, не должно удаляться?
Вывод такой же :)
Отредактировано tsatur (Март 28, 2014 23:44:00)
Офлайн
tsaturначало придётся отдельно искать
А как насчет того, что строка должна начинаться со слова “Глава”
если совпадает с "^Глава" то
заменить переносы
конец если
tsaturэто мне показалось, да и всё равно он затратный (слишком много повторяющегося поиска)
Вывод такой же
Отредактировано py.user.next (Март 28, 2014 23:48:17)
Офлайн
Обидно. Я думал недокурил маны. Спасибо!
Офлайн
его можно сделать, но он некрасивый и затратный
выполни import this, там правила, которых принято придерживаться
Офлайн
Это может подойти:
>>> 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)
Офлайн
вот пример построения программы
dip3. plural example
там поиск и замена разделены
так сложный алгоритм разделяется на несколько простых, соединённых вместе
Отредактировано py.user.next (Март 29, 2014 08:03:03)
Офлайн
Спасибо всем за помощь, но решение задачи необходимо было построить именно на рег выражениях с заменой без предварительного поиска.
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)
Офлайн