Сопоставьте многострочную строку, начинающуюся и заканчивающуюся одним и тем же неизвестным символом - PullRequest
0 голосов
/ 13 июля 2020

Regex для соответствия многострочной строке, начинающейся с 'banner ...............', где x берется из самого регулярного выражения

r'banner (\^|\$)(.*\n)*(\^|\$)'

поможет с 'banner ^ ........ ^' или 'banner $ ....... $', но что, если я не знаю, что это за персонаж, и хочу, чтобы он был символом сразу после 'banner'

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

Пример текста

banner ^

------ WARNING  ---------------------------------------------------------
This equipment is the property of XYZ.
Any unauthorised connection attempt is prohibited and will result
in criminal prosecution under applicable criminal laws.
--------------------------------------------------------------------------
^

или

banner $
      _____________________________
     | Unauthorized access to this |
     | system is forbidden and     |
     | subject to prosecution.     |
     | All actions performed on    |
     | this device are logged.     |
      -----------------------------
 .       .
 \`-"'"-'/
  } 6 6 {
 =.  Y  ,=
   /^^^\  .
  /     \  )
 (  )-(  )/
  ""   ""
$

Но имейте в виду, что символ $ / ^ неизвестен Ура

Ответы [ 2 ]

1 голос
/ 13 июля 2020

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

Вы можете захватить первый символ без пробелов после баннера в группе захвата и используйте обратную ссылку на это захваченное значение, используя \1

. Это предотвратит ненужный возврат вместо использования (.*\n)* или [\s\S]*?

\bbanner (\S).*(?:\r?\n(?!\1).*)*\r?\n\1

Пояснение

  • \bbanner (\S) Сопоставить баннер, пробел и захватить непробельный символ в группе 1
  • .* Сопоставить остальную часть строка
  • (?: Группа без захвата
    • \r?\n(?!\1).* Соответствует новой строке, если она не начинается с захваченного значения
  • )* Закрыть группу и повторите ее 0+ раз
  • \r?\n\1 Сопоставьте новую строку, за которой следует захваченное значение

Regex demo


Если значение должно быть одним значением в начале строки и одним значением в строка для последнего совпадения:

^banner (\S)(?:\r?\n(?!\1).*)*\r?\n\1$

Regex demo

1 голос
/ 13 июля 2020

Вы ищете обратные ссылки . Попробуйте следующее:

r'banner (\S)(.*\n)*(\1)'

Где \1 - это обратная ссылка на первую группу захвата. \S будет соответствовать чему угодно, кроме пробела. Если вы хотите сопоставить только символы, вы можете использовать [^\w\s] вместо \S.

Однако это регулярное выражение не соответствует вашему образцу banner ^ ........ ^, потому что эта строка не содержит новой строки. Если вы хотите сопоставить любую комбинацию символов или новых строк, вместо того, чтобы абсолютно требовать новую строку, вы можете использовать:

r'banner (\S)[\s\S]*(\1)'

Demo

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