Я хочу анализировать десятичные числа независимо от их формата, который неизвестен. Язык оригинального текста неизвестен и может варьироваться. Кроме того, исходная строка может содержать дополнительный текст до или после, например валюту или единицы измерения.
Я использую следующее:
# NOTE: Do not use, this algorithm is buggy. See below.
def extractnumber(value):
if (isinstance(value, int)): return value
if (isinstance(value, float)): return value
result = re.sub(r'&#\d+', '', value)
result = re.sub(r'[^0-9\,\.]', '', result)
if (len(result) == 0): return None
numPoints = result.count('.')
numCommas = result.count(',')
result = result.replace(",", ".")
if ((numPoints > 0 and numCommas > 0) or (numPoints == 1) or (numCommas == 1)):
decimalPart = result.split(".")[-1]
integerPart = "".join ( result.split(".")[0:-1] )
else:
integerPart = result.replace(".", "")
result = int(integerPart) + (float(decimalPart) / pow(10, len(decimalPart) ))
return result
Такие работы...
>>> extractnumber("2")
2
>>> extractnumber("2.3")
2.3
>>> extractnumber("2,35")
2.35
>>> extractnumber("-2 000,5")
-2000.5
>>> extractnumber("EUR 1.000,74 €")
1000.74
>>> extractnumber("20,5 20,8") # Testing failure...
ValueError: invalid literal for int() with base 10: '205 208'
>>> extractnumber("20.345.32.231,50") # Returns false positive
2034532231.5
Поэтому мой метод кажется мне очень хрупким и возвращает много ложных срабатываний.
Есть ли какая-нибудь библиотека или интеллектуальная функция, которая может справиться с этим? В идеале 20.345.32.231,50
не должен проходить, но числа на других языках, таких как 1.200,50
или 1 200'50
, будут извлечены, независимо от количества другого текста и символов (включая символы новой строки) вокруг.
(Обновленная реализация в соответствии с принятым ответом: https://github.com/jjmontesl/cubetl/blob/master/cubetl/text/functions.py#L91)
123 456
?123456
или[123, 456]
? - person Steinar Lima   schedule 23.11.2013