代码之家  ›  专栏  ›  技术社区  ›  Mad Physicist

是否有一个Python等价于C的strtod的endptr参数[[副本]

  •  3
  • Mad Physicist  · 技术社区  · 6 年前

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

    在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 回复  |  直到 6 年前
        1
  •  0
  •   L3viathan gboffi    6 年前

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

    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 而不是不断地重建弦。

    推荐文章