【问题标题】:Is there a Python equivalent to the endptr parameter to C's strtod? [duplicate]是否有一个 Python 等效于 C 的 strtod 的 endptr 参数? [复制]
【发布时间】:2018-10-31 11:46:27
【问题描述】:

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

在 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) 是行不通的。

有没有更好的方法从字符串的开头获取浮点数,以便我可以将其余部分作为其他内容处理?

【问题讨论】:

  • locale.atof?没用过也不知道ti有多全面。
  • float 本身不支持区域设置。如果你想要区域设置感知,你想要像locale.atof 这样的东西,它会拒绝float 接受的一些东西。
  • 是的。这是一个骗局。太糟糕了,那里没有任何像样的答案......
  • 我关闭了这个问题,它是完全重复的。恐怕你被正则表达式困住了。欺骗链接建议从浮点解析的 C 源重新实现函数......是的,为什么不呢?
  • @Jean-FrançoisFabre。大概。如果我发现更好的东西,我会发布另一个问题的答案......

标签: python strtod


【解决方案1】:

我知道这是一个愚蠢的解决方案,但是如何:

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,而不是不断地重新创建字符串。

【讨论】:

  • 嘿,同样的想法 :)
  • @Jean-FrançoisFabre。和同样的评论。对于长字符串,二进制搜索会更好地工作,老实说,这听起来根本不是一个好方法。
猜你喜欢
  • 2011-11-25
  • 2010-11-30
  • 2015-05-16
  • 2018-07-15
  • 2011-04-21
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多