Извлечь числовой процент из строки, содержащей несколько чисел - PullRequest
2 голосов
/ 30 апреля 2020

Я хочу извлечь числовой процент в строке. Вот некоторые случаи:

  • вход: "Банк AB C 123% CDE" -> выход: 123.00 (в виде числа с плавающей запятой)
  • вход: "Какой-то случайный банк IPCA + 12,34% "-> вывод: 12,34
  • ввод:" Банк1 2,3% "-> вывод: 2,3

Запятые используются исключительно в качестве разделителей и есть только один процент для каждой строки, поэтому следующие строки никогда не появятся:

  • неверный ввод: "Bank AB C, 123%"
  • неверный ввод: "Bank AB C 123 % и 12,34% "

В настоящее время я использую следующий скрипт в Python

def extract_percentage(x: str) -> float:
   float((re.sub(r'[^\d,]', '', x)).replace(',','.'))

Он работает для первых двух примеров выше, но для в-третьих, вывод составляет 12,3

Как мне это сделать? Предпочтительно с использованием Python.

Ответы [ 2 ]

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

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

Мы начнем с поиска всех строк, заканчивающихся на %: '.*%'. Для Bank ABC 123% CDE это вернет Bank ABC 123% CDE, который содержит пробел и не цифры.

Чтобы улучшить это, давайте посмотрим на числа с 1 запятой или точкой не более: \d*[,.]?\d*%, это вернет 123% для вашего ввода

Чтобы подвести итог, давайте заменим запятую на точку

import re

str = 'Bank1 2,3%'
arr = [x.replace(',','.') for x in re.findall('\d*[,.]?\d*%',str)]
print(arr)
>>> ['2.3%']

Обратите внимание, что ответом является массив всех совпадений

Если вы хотите получить номер, теперь вы можете просто сделать:

if len(arr)>0:
  number_without_percent_sign = arr[0][:-1]
  print(float(number_without_percent_sign))
>>> 2.3
0 голосов
/ 30 апреля 2020

Вдохновленный ответом Shahar Bental выше, я получил другое решение, которое меньше полагается на регулярное выражение и использует метод split из python. Не уверен, что лучше, хотя.

Я добавил следующее в мой предыдущий скрипт:

words = x.split(' ')
for word in words:
  if '%' in word:
    return float((re.sub(r'[^\d,]', '', word)).replace(',','.'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...