Python RegEx удаляет 2 пустые строки и следующую строку, состоящую ровно из 64 звездочек - PullRequest
0 голосов
/ 09 октября 2019

В файле, открытом следующим образом:

with open(fullpath, "r", encoding="utf-8", errors="ignore") as f:
    filedata = f.read()

Я пытаюсь удалить 2 новых строки перед любой строкой, содержащей 64 звездочки. например, заменить:



****************************************************************

на:

****************************************************************

Мой входной файл фактически имел случайные пробелы в некоторых пустых строках. Следующее регулярное выражение сопоставляет и удаляет одну новую строку:

filedata = re.sub(r"(\r\n|\n|\r)\*{64}",
                  "****************************************************************",
                  filedata)

, что приводит к:


****************************************************************

(обратите внимание, что в приведенном выше выводе есть две строки)

Носледующее не соответствует:

filedata = re.sub(r"(\r\n|\n|\r)(\r\n|\n|\r)\*{64}",
                  "****************************************************************",
                  filedata)

Кроме того, как может быть видно из моего кода, у меня возникают трудности с поиском способа определения аргумента repl как регулярного выражения. то есть использование r"\*{64}" вместо строки из 64 звездочек не работает

1 Ответ

0 голосов
/ 09 октября 2019

Прежде всего, вам не нужно писать 64 звездочки в замене, просто захватите деталь (\*{64}) с группой захвата и используйте \1 в шаблоне замены.

Обратите внимание, что, поскольку на двух пустых строках есть несколько необязательных горизонтальных пробелов, вы должны сопоставить их с [^\S\r\n]*.

Я предлагаю

(?m)^[^\S\r\n]*(?:(?:\r\n?|\n)[^\S\r\n]*){2}(\*{64})$

Или, как вашОкончания строк были переведены в LF, когда вы открыли файл в режиме чтения

(?m)^[^\S\n]*(?:\n[^\S\n]*){2}(\*{64})$

См. regex demo

Подробности

  • (?m) - опция MULTILINE для
  • ^ - начало строки
  • [^\S\r\n]* - 0+ горизонтальных пробелов
  • (?:(?:\r\n?|\n)[^\S\r\n]*){2} - 2 вхождения
    • (?:\r\n?|\n) - окончания CRLF, CR или LF
    • [^\S\r\n]* - 0+ горизонтальных пробелов
  • (\*{64})- Группа 1: 64 звездочки
  • $ - конец строки.

См. Демонстрационную версию Python :

import re
text="\n\n****************************************************************\n \t \n\t \n  ****************************************************************"
print("'" + re.sub(r'(?m)^[^\S\r\n]*(?:(?:\r\n?|\n)[^\S\r\n]*){2}(\*{64})$', r'\1', text) + "'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...