регулярное выражение для выделения символов новой строки в начале и конце - PullRequest
3 голосов
/ 06 марта 2020

Я пытаюсь выяснить, как написать простое регулярное выражение, которое будет выделять символы новой строки, только если они появляются в начале или конце некоторых данных при сохранении новой строки.

В приведенном ниже примере строки 1 и 14 - это новые строки. Это единственные две строки, которые я пытаюсь выделить, когда они появляются в начале и в конце данных.


import regex as re
from colorama import Fore, Back

def red(s):
    return Back.RED + s + Back.RESET

with open('/tmp/1.py', 'r') as f:
    data = f.read()

print(
    re.sub(r'(^\n|\n$)', red(r'\1'), data)
)

В открытом выражении данные имеют тот же контент, что и приведенный выше пример.

В приведенном выше примере, это результат, который я получаю:

enter image description here

Как видно, отсутствует красная подсветка в строке 1 и охватывает весь путь в строке 14. Мне бы хотелось, чтобы цвет появлялся только один раз на символ новой строки.

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Вы можете использовать свое регулярное выражение, но без флага "multiline". Затем он будет видеть всю строку как единое целое, и вы на самом деле будете соответствовать желаемому результату.

^\n|\n$

Здесь вы можете видеть, что есть два совпадения. И если вы удалите новые строки в начале или в конце, совпадения исчезнут. Многолинейный флаг устанавливается или отключается в конце строки регулярного выражения. Вы также можете сделать это на своем языке.

https://regex101.com/r/pSRHPU/2

0 голосов
/ 07 марта 2020

После прочтения всех комментариев и предложений и объединения подмножества их всех, я наконец-то получил рабочую версию. Для всех, кто интересуется:

Одна проблема, которую я не могу преодолеть, не написав проверку на спецификацию os c, состоит в том, как добавляется дополнительная новая строка для windows.

Несколько основных моментов, которые были подобраны:

  • не может раскрасить \n. Так что замените это пробелом и переводом строки.
  • не проверял это, но, избавившись от замены группы, можно применить это и к байтам.
  • Windows поддерживается может быть достигнуто с init в колораме

import regex as re
from colorama import Back, init

init() # for windows

def red(s):
    return Back.RED + s + Back.RESET

with open('/tmp/1.py', 'r') as f:
    data = f.read()

fist_line = re.sub('\A\n', red(' ')+'\n', data)
last_line = re.sub('\n\Z', '\n'+red(' '), fist_line)
print(last_line)

OSX / Linux

enter image description here

Windows

enter image description here

0 голосов
/ 06 марта 2020

Я нашел способ, который позволяет вам сопоставить начало / конец всей строки. См. Часть «Постоянное начало строки и конец якоря строки» из https://www.regular-expressions.info/anchors.html

\A только когда-либо совпадает в начале строки. Аналогично, \Z соответствует только когда-либо в конце строки.

Я создал демо здесь https://regex101.com/r/n2DAWh/1

Регулярное выражение: (\A\n|\n\Z)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...