Регулярное выражение, чтобы соответствовать все до строки - PullRequest
0 голосов
/ 20 ноября 2019

Я пытаюсь сопоставить все до последней строки "Saving *" перед "ModelFinish". Я могу почти сделать это с отрицательным осмотром (описанным в Регулярное выражение, чтобы соответствовать строке, которая не содержит слово ), но не могу заставить его работать с символами новой строки в строке, которую я пытаюсьчтобы соответствовать. Я использую блокнот ++ и есть флажок ". Соответствует новой строке"

Ввод:

Begin: model 17
Epoch 15800, loss 4051304.017, val_PMAE 6.9
Saving at epoch 15828 with loss: 3974847.290
Saving at epoch 15889 with loss: 3968749.471
ModelFinish: Stop training
Begin: model 18
Saving at epoch 15889 with loss: 3968749.223
Saving at epoch 15889 with loss: 3968749.200
Epoch 15800, loss 4051304.017
ModelFinish: Stop training
Begin: model 19

Желаемое первое совпадение:

Begin: model 17
Epoch 15800, loss 4051304.017, val_PMAE 6.9
Saving at epoch 15828 with loss: 3974847.290

Желаемое второе совпадение:

Begin: model 18
Saving at epoch 15889 with loss: 3968749.223

Моя попытка (с проверкой ". Соответствует символу новой строки"):

^Begin:(?:(?!Saving.*Model).)*$

Я планирую использовать notepad ++ для поиска и замены текста, который мне не нужен, на "", так что мне остается только окончательный "проигрыш" от каждой модели. (То есть: потеря модели 17: 3968749.471, потеря модели 18: 3968749.200 и т. Д.)

1 Ответ

0 голосов
/ 20 ноября 2019

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

Для совпадения до последнего вхождения Сохранение до ModelFinish вы можете сопоставить строки, которые не начинаются с ModelFinish, и использовать положительный прогноз (?=, который утверждает, что далее следует перевод строки и сохранение.

^Begin:.*(?:\R(?!ModelFinish).*)*(?=\RSaving)
  • ^ Начало строки
  • Begin:.* Соответствие Begin: и любой символ, кроме новой строки 0+ раз
  • (?: Группа без захвата
    • \R(?!ModelFinish) Соответствиеперевод строки и утверждение, что строка не начинается с ModelFinish
    • .* Соответствует любому символу кроме символа новой строки 0+ раз
  • )* Закрыть группу без захвата иПовторите 0+ раз
  • (?=\RSaving) Позитивный взгляд, утверждайте, что справа - новая строка с последующим сохранением

Regex demo

...