Как применить регулярное выражение оглядки назад к шаблону, в котором могут быть переменные символы? - PullRequest
2 голосов
/ 30 апреля 2020

Мне нужно собрать два значения 36.12 и 25.40 в следующей строке:

первоначальная скидка в 9,17% (сумма со скидкой: 36,12 долларов США) и скидка в размере 36,12% (сумма с скидка: 25,40 долл. США), доставка в течение 15 дней

Обратите внимание, что обоим количествам предшествует одинаковая строка символов amount with discount: USD, метки для желаемых значений: original discount и negociated discount.

Для первого желаемого значения я попытался (?<=original discount of ).*\), который правильно захватывает 9.17 % (amount with discount: USD 36.12), затем добавил ((?<=amount with discount: USD).*) (что приводит к полному регулярному выражению (?<=original discount of ).*\)((?<=amount with discount: USD).*)), чтобы захватить 36.12, но это не работает (пробовал то же самое для второго желаемое значение, изменяя original на negotiated).

Есть ли какие-либо подсказки по этому поводу? Есть ли более простой способ?

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете захватить обе нужные вам части:

((?:negociated|original) discount).*?\bUSD\s*(\d+(?:\.\d+)?)

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

Подробности

  • ((?:negociated|original) discount) - Группа 1: либо negociated или original, а затем discount word
  • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \bUSD - целое слово USD
  • \s* - 0+ пробелов
  • (\d+(?:\.\d+)?) - группа 2: 1+ цифр, за которыми следует необязательный . и последовательность из 1+ цифр

В R stringr вы можете извлечь эти значения, используя

x <- "original discount of 9.17 % (amount with discount: USD 36.12) and negociated discount of 36.12 % (amount with discount: USD 25.40), delivery in 15 days"
res <- stringr::str_match_all(x, "((?:negociated|original) discount).*?\\bUSD\\s*(\\d+(?:\\.\\d+)?)")
lapply(res, function(z) z[,-1])

См. онлайн-демонстрацию R

...