Иногда хорошие старые инструменты по-прежнему работают лучше всего. В СЭД, я мог бы написать что-то вроде этого:Соответствующие диапазоны строк в python (например, диапазоны sed)
sed '/^Page 5:/,/^Page 6:/p'
sed '110,/^Page 10:/+3p'
sed '/^Page 5:/,/^Page 6:/s/this/that/g'
Первый применяет замену всех линий между теми согласующего/^ Страница 5:/и/^ Page 6: /. Второй начинает печатать на линии 110 и останавливает 3 строки после одного совпадения/^ Страница 10: /. В третьем примере применяется замена каждой строки в указанном диапазоне.
Я не возражаю против поиска re.search для поиска по строкам, но для диапазонов строк, номеров строк или относительных смещений мне приходится писать весь парсер. Есть ли идиома или модуль python, которые могут упростить такие операции?
Я не хочу называть sed из python: я делаю вещи типа python с текстом и просто хочу иметь возможность работать на линейных диапазонах простым способом.
Редактировать: Это нормально, если решение работает в списке строк python. Я не хочу обрабатывать гигабайты текста. Но мне нужно указать несколько операций, а не один, и чередовать их с однострочными регулярными выражениями. Я посмотрел на итераторы (на самом деле я бы приветствовал решение с использованием итераторов), но результаты всегда выходили из-под контроля за чем-то большим, чем одиночная операция.
Вот простой пример: фрагмент кода с комментариями в стиле Java, который должен быть изменен на комментарии python. (Не волнуйтесь, я не пытаюсь написать кросс-компилятор с помощью регулярных выражений :-)
/*
This is a multi-line comment.
It does not obligingly start lines with " * "
*/
x++; // a single-line comment
Это тривиально, чтобы написать регэкспы, что изменение «//» комментарии к «#» (а также падение с запятой, измените «++» на «+ = 1» и т. д.). Но как мы вставляем «#» в начале каждой строки многострочного комментария java? Я могу сделать это с регулярным выражением по всему файлу в виде одной строки, что является болью, потому что остальные преобразования являются ориентированными на линию. Я также не смог (полезно) интегрировать итераторы с линейно ориентированными регулярными выражениями. Я был бы признателен за предложения.
«В конечном итоге нужно написать целый парсер»? Просто для подсчета строк? Зачем? –
«Но как мы вставляем« # »в начале каждой строки многострочного комментария Java?» Это гораздо более сложный вопрос. Не имеет отношения к названию вопроса и первой части вопроса. Если это то, что вы действительно хотите узнать, а затем задайте ** настоящий вопрос отдельно. –
@S, мой оригинальный вопрос сказал: «Я делаю вещи типа python с текстом и просто хочу иметь возможность работать на линейных диапазонах простым способом». Я хочу сопоставить диапазоны строк, чтобы что-то с ними делать, а не просто распечатывать их. Это мой первый вопрос SO, и я многому учусь о том, как не допустить, чтобы неправильные части обращали внимание. – alexis