Извлечение чисел из строки - PullRequest
0 голосов
/ 04 мая 2020

У меня большая текстовая строка. Рассмотрим текстовую версию счета. В этом у меня есть несколько строк текста и чисел.

Одна из текстовых строк в этой большей строке находится ниже:

"Freight charge - 139 KG @ USD 0.70/KG                                                                                              Zero Rated                             97.30\n"

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

Я хочу извлечь из него 97.30. Вопрос в том нет. цифр слева и справа от "." может быть любой ди git.

Итак, я попробовал это,

freight_charge = re.search(r"Freight charge.*Zero Rated\s*(.*)",s).group(1)

, и это работает, и я получаю 97,30

Я хочу избегать использования промежуточного значения "с нулевым рейтингом", так как я не уверен, если это останется неизменным для одной и той же строки, поэтому я попробовал это:

freight_charge = re.search(r"Freight charge.*([\d]*\.[\d]*)",output)


print(freight_charge.group())
print(freight_charge.group(1))    


Freight charge - 139 KG @ USD 0.70/KG                                                                                              Zero Rated                             97.30
.30

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

Не уверен, почему 97 до этого не извлекается, когда я поставил [\ d] * перед точкой в ​​подвыражении группы

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Причина в том, что .* будет сначала совпадать до конца строки. Затем регулярное выражение вернется к первому местоположению, где оно может произвести сопоставление, которое соответствует точке, поскольку это не является обязательным.

Если вы не хотите сопоставлять только точку, но хотите сопоставить для пример .30 или 30, если это единственное значение, вы можете добавить соответствующий пробел до и соответствовать 1 или более цифрам после точки или только цифр.

Freight charge.* (\d*\.?\d+)

Regex demo | Python демо

Пример кода

import re
s= r"Freight charge - 139 KG @ USD 0.70/KG                                                                                              Zero Rated                             97.30\n"
freight_charge = re.search(r"Freight charge.* (\d*\.?\d+)",s).group(1)
print(freight_charge)

Выход

97.30
1 голос
/ 04 мая 2020

Вы можете просто использовать это регулярное выражение /(\d+.\d+)/g и захватить 3-ю группу. Ниже приведен образец JS, но он также будет работать с Python

  var str = "Freight charge - 139 KG @ USD 0.70/KG                                                                                              Zero Rated                             97.30\n";
  var patt = /(\d+.\d+)/g;
 var result = str.match(patt);
 
 console.log(result[2])

Результат: 97.30

0 голосов
/ 04 мая 2020

Вы можете сделать то же самое, что и вы, но просто замените * на +, который получит один или несколько номеров раньше. и одно или несколько чисел после

freight_charge = re.search(r"Freight charge.* (\d*\.\d*)",output)
print(freight_charge.group(1))

на выходе

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