Найти - Пользователи
Полная версия: Регулярные выражения
Начало » Python для экспертов » Регулярные выражения
1
tsatur
Здравствуйте. Никак не могу решить одну задачку. Имеется текст, начинающийся с заранее известного слова, пусть будет “Глава”. Текст может состоять из 2 и более строк, каждая из которых заканчивается символом переноса строки \n. Необходимо объединить строки в одну, при условии, что последующая строка содержит какие-либо символы, помимо переноса строки. Например, строка “Глава 1. Регулярные выражения \n в Python\n \n” должна превратиться в “Глава 1. Регулярные выражения в Python \n”.
Заранее благодарю!
py.user.next
>>> 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
А как насчет того, что строка должна начинаться со слова “Глава”, которое со всем содержимым, помимо \n, не должно удаляться?

Вывод такой же :)
py.user.next
tsatur
А как насчет того, что строка должна начинаться со слова “Глава”
начало придётся отдельно искать

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

tsatur
Вывод такой же
это мне показалось, да и всё равно он затратный (слишком много повторяющегося поиска)
tsatur
Обидно. Я думал недокурил маны. Спасибо!
py.user.next
его можно сделать, но он некрасивый и затратный
выполни import this, там правила, которых принято придерживаться
o7412369815963
Это может подойти:
>>> 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
вот пример построения программы
dip3. plural example

там поиск и замена разделены
так сложный алгоритм разделяется на несколько простых, соединённых вместе
tsatur
Спасибо всем за помощь, но решение задачи необходимо было построить именно на рег выражениях с заменой без предварительного поиска.
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'
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB