我希望解析十进制数,而不管它们的格式如何,这是未知的。原始文本的语言未知,可能会有所不同。此外,源字符串之前或之后可以包含一些额外的文本,如货币或单位。
我正在使用以下内容:
# 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 )