是否有一个Python等同于C的strtod的endptr参数?

时间:2018-05-21 19:15:06

标签: python strtod

我正在尝试编写一个函数来拆分包含浮点数和某些单位的字符串。字符串在数字和单位之间可能有也可能没有空格。

在C中,函数strtod有一个非常方便的参数,名为endptr,允许您解析字符串的初始部分,并获得指向其余部分的指针。由于这正是我在这个场景中所需要的,我想知道在Python中是否存在类似的功能。

由于float本身目前不提供此功能,因此我使用基于https://stackoverflow.com/a/4703508/2988730的正则表达式解决方案:

float_pattern = re.compile(r'[+-]?(?:(?:\d+\.?)|(?:\d*.\d+))(?:[Ee][+-]?\d+)')
def split_units(string):
    match = float_pattern.match(string)
    if match is None: raise ValueError('not a float')
    num = float(match.group())
    units = string[match.end():].strip()
    return num, units

由于两个原因,这并不完全足够。首先是它重新发明轮子。第二个是它没有正确的语言环境感知而没有增加额外的复杂性(这就是为什么我不想首先重新发明轮子)。

对于记录,字符串的尾部不能包含数字将包含的任何字符。唯一真正的问题是我不要求单位用空格分隔数字,所以做一个简单的string.split(maxsplit=1)是行不通的。

有没有更好的方法从字符串的开头获取浮点数,所以我可以将其余的处理为其他东西?

1 个答案:

答案 0 :(得分:0)

我知道这是一个愚蠢的解决方案,但是这个怎么样:

def float_and_more(something):
    orig = something
    rest = ''
    while something:
        try:
            return float(something), rest                  
        except ValueError:
            rest = something[-1] + rest                    
            something = something[:-1]                     
    raise ValueError('Invalid value: {}'.format(orig))

你可以像这样使用它:

>>> float_and_more('2.5 meters')
(2.5, 'meters')

如果你想真正使用它,你可能会使用io.StringIO而不是不断重新创建字符串。