我希望解析十进制数,而不管它们的格式是未知的。原文的语言未知,可能会有所不同。此外,源字符串可以在前面或后面包含一些额外的文本,例如货币或单位。在
我用的是:
# 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
这类作品。。。在
^{pr2}$所以我的方法对我来说非常脆弱,并且返回了很多误报。在
是否有任何库或智能函数可以处理此问题?理想情况下,20.345.32.231,50
不能传递,但是其他语言中的数字,如1.200,50
或{
(根据接受的答案更新实施: https://github.com/jjmontesl/cubetl/blob/master/cubetl/text/functions.py#L91)
我重新修改了你的代码。这和下面的
valid_number
函数应该可以做到这一点。在不过,我花时间写这段糟糕的代码的主要原因是向未来的读者展示,如果你不知道如何使用regexp(比如我),解析正则表达式会变得多么糟糕。
希望,比我更了解regexp的人可以向我们展示如何应该完成它:)
约束
.
、,
和{123,456
被解释为123.456
,而不是{' '
)拆分为数字列表123,456.00
和{2345,11.00
不被认为是vald)代码
import re
from itertools import combinations
好吧-这里有一些代码可以用几个regexp语句替换。
^{pr2}$输出
您可以使用一个合适的特殊正则表达式来实现这一点。这是我最好的尝试。我使用命名的捕获组,因为对于模式,这种复杂的、数值的组在反向引用中使用会更加混乱。在
首先,regexp模式:
下面是一个函数来使用它:
^{pr2}$一些只有一个逗号或句点且后面正好有三个数字的数字字符串(例如
"1,234"
和"1.234"
)是不明确的。这段代码将把它们都解析为带有一千个分隔符(1234
)的整数,而不是浮点值(1.234
),而不管实际使用的分隔符是什么。如果您希望这些数字有不同的结果(例如,如果您希望使用1.234
进行浮点运算),则可以使用一个特殊情况来处理此问题。在一些测试输出:
相关问题 更多 >
编程相关推荐