我正在尝试编写一个函数来拆分包含浮点数和某些单位的字符串。字符串在数字和单位之间可能有也可能没有空格。
在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)
是行不通的。
有没有更好的方法从字符串的开头获取浮点数,所以我可以将其余的处理为其他东西?
答案 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
而不是不断重新创建字符串。