Как написать если условия в регулярном выражении? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь получить сумму из следующей строки:

Стоимость доставки $ 2
Промо - (ПЕРВЫЙ) ($ 4)
$ 7
Новые монеты заработали $ 5
Выпущено от имени .......................

Строка "Новые монеты заработали 5 долларов" может отсутствоватькогда-то.Я готов получить оплаченную сумму, которая в данном случае равна «7».Я попытался с \.?\s*\n*([\d.,]+)\s*\n*Issued\s*\n*on, но это будет только фиксировать сумму, если «Новые монеты заработали 5 долларов», которых нет в документе.Я читал о том, если еще условия и позитивные взгляды.Тем не менее, не мог заставить это работать.Любые предложения о том, как захватить?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете сделать это так же, как (?(?=regex)then|else), но обратите внимание, что (?=) является упреждающим и имеет нулевую длину, поэтому ваше условие then также должно соответствовать выражению в скобках.

Вы также можете создавать более сложные выражения вспособ (?(?=condition)(then1|then2|then3)|(else1|else2|else3)), где then1, then2, then3 отсортировано в порядке убывания приоритета, потому что первое совпадение с условием "затем" пропустит все остальные.

Более подробную информацию можно найти здесь

0 голосов
/ 01 марта 2019

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

\$(\d[\d,.]*)[\n\r]+(?:.*[\r\n]+){0,2}Issued\s+on\b

Необходимое значение находится в группе 1.

Подробности

  • \$ - a $ char
  • (\d[\d,.]*) - Группа 1: цифра, за которой следуют любые цифры 0+, , или .символы
  • [\n\r]+ - 1 или более символов CR или LF
  • (?:.*[\r\n]+){0,2} - 0, 1 или 2 повторения 0+ символов, кроме символов разрыва строки, за которыми следуют символы 1+ LF / CR
  • Issued\s+on\b - Issued, 1+ пробелов, on как целое слово (так как \b - граница слова).

См. regex demo .

Python demo :

import re
rx = r"\$(\d[\d,.]*)[\n\r]+(?:.*[\r\n]+){0,2}Issued\s+on\b"
s = "Delivery Charge $2\nPromo - (FIRST) ($4)\n$1,000.55\nNew Coins earned $5\nIssued on behalf of ......................."
match = re.search(rx, s, re.M)
if match:
    print(match.group(1)) # -> 1,000.55
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...