поиск строки между двумя наборами альтернативных строк с перекрытием - PullRequest
4 голосов
/ 07 августа 2020

У меня есть несколько строк, которые выглядят так:

str1="Quantity and price: 120 units;the total amount:12000.00"
str2="Quantity:100, amount:10000.00"
str3="Quantity:100, price: 10000 USD"
str4="Parcel A: Quantity:100, amount:$10000.00,Parcel B: Quantity:90, amount:$9000.00"
strlist=[str1,str2,str3,str4]

Я хочу сопоставить сумму $ 12000, $ 10000, 10000 в первых 3 строках и 10000 долларов США и 9000 долларов США в последней строке. Однако в первой строке есть и «цена», и «сумма». Я подумал, используя "|" регулярное выражение будет искать слева направо, поэтому я хочу, чтобы регулярное выражение сначала смотрело «количество», если оно не представлено, ищите «цену». Я пробовал следующий код:

amount_p = re.compile(r'(?:amount|price):(.*?)(?:USD|\.00)') 
for i in strlist:
    amount=re.findall(amount_p,i)
    print(amount)
[' 120 units;the total amount:$12000']
['10000']
[' 10000 ']
['$10000', '$9000']

Каким-то образом регулярное выражение игнорировало «количество» и искало только «цену» в первой строке. Затем я попробовал следующее:

amount_p = re.compile(r'.*(?:amount|price):(.*?)(?:USD|\.00)') 

, что дает мне

['12000']
['10000']
[' 10000 ']
['$9000']

В этом случае регулярное выражение соответствует только 9000 долларов в последней строке и игнорирует 10000 долларов. Итак, мой вопрос в том, какова функция. * Вначале и есть ли способ решить мою проблему? Поиск чисел не работает, потому что в моих реальных данных в одном тексте есть много других чисел. Заранее всем спасибо !!!!

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вы можете использовать

re.findall(r'(?:price|amount):\s*\$?(\d+)(?:\.\d+|\s*USD)', text)

См. демонстрацию регулярных выражений

Подробности

  • (?:price|amount) - price или amount
  • : - двоеточие
  • \s* - 0+ пробелов
  • \$? - необязательный знак доллара
  • (\d+) - Группа 1: одна или несколько цифр
  • (?:\.\d+|\s*USD) - группа без захвата, соответствующая . и 1+ цифрам или 0+ пробелам, а затем USD подстроке.
1 голос
/ 07 августа 2020

С первым оператором:

amount_p = re.compile(r'(?:amount|price):(.*?)(?:USD|\.00)')

Вы не сгруппировали строку должным образом, как хотели (я полагаю, вы хотели сгруппировать по ':'), поэтому у вас все еще была строка. как один. Вы смогли получить свои цифры в str2 и str3 только потому, что '.USD' and '.00' пришел вам на помощь.

Со вторым оператором:

amount_p = re.compile(r'.*(?:amount|price):(.*?)(?:USD|\.00)')

Вы смогли правильно разделить свои строки используя ':'. Таким образом, str1 one будет выглядеть так:

Portion1: «Количество и цена» и Portion2: «120 единиц; общая сумма: 12000.00»

и поэтому вы смогли извлечь ваши ценности. Вы можете рассматривать это как что-то вроде этого:

strlist=[str1.split(';')[1],str2,str3,str4]

, что в сочетании с вашим первым шаблоном дает тот же результат, что и второй

Ссылка: https://www.tutorialspoint.com/python/python_reg_expressions.htm

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