Как извлечь следующую строку после определенного ключевого слова, когда между ними есть слова с использованием регулярных выражений в Python?

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу извлечь сумму 495,65 после сопоставления с ключевым словом total. Сумма указана в следующей строке. Заранее спасибо!

Итого: (Только четыреста девяносто шесть и шестьдесят пять дирхамов)

496.65

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

     re.findall('(?<=total :)((.*){2})', string, re.IGNORECASE)
 

Результат: (Только четыреста девяносто шесть и шестьдесят пять дирхамов)

Ответ №1:

Вы можете сопоставить total : и зафиксировать значение в группе, сопоставив 1 или более символов новой строки после сопоставления остальной части строки.

 bTotal :.*[rn] (d (?:.d ))b
 

Объяснение

  • bTotal :.* Совпадение total : и остальная часть строки
  • [rn] Сопоставьте 1 новые строки
  • (d (?:.d )) Группа захвата 1, сопоставьте цифру с необязательной десятичной частью
  • b Граница слова

Демонстрация регулярных выражений | Демонстрация Python

Пример кода

 import re

regex = r"bTotal :.*[rn] (d (?:.d ))b"

test_str = ("Total :(Dirham Four Hundred Ninety Six and Sixty Five fils Only)nn"
    "496.65nn"
    "Best Regards,n"
    "y approve the proposal and arrange the payment, accordingly we will provide you the taxn"
    "invoice .")

print(re.findall(regex, test_str, re.IGNORECASE))
 

Вывод

 ['496.65']
 

Комментарии:

1. Спасибо! Это сработало. Что делать, если сумма (число) находится в третьей строке, а сумма в словах — во второй строке? Как можно извлечь сумму в этом случае?

2.@M_Arora Вы могли бы сделать это так bTotal :.*r?n(.*)r?n(d (?:.d )?)b regex101.com/r/VGi0wD/1 или как это сопоставление всех строк после итога: которые не начинаются с цифры, а затем фиксируют сумму, когда она начинается с цифры и необязательной десятичной части bTotal :.*(?:r?n(?!d).*)*r?n(d (?:.d ))b regex101.com/r/N7F9Dj/1