解析字符串以查找并移除浮点数
我创建了一个Python的方法,这个方法可以接收一个长度不固定的字符串,这个字符串的结尾总是会有一个浮点数:
"adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
或者
"asdif adfi=9393 adfkdsf:1.84938"
我需要从这个字符串中提取出结尾的浮点数。通常在浮点数前面会有一个分隔符,比如:-或者一个空格。
def findFloat(stringArg):
stringArg.rstrip()
stringArg.replace("-",":")
if stringArg.rfind(":"):
locateFloat = stringArg.rsplit(":")
#second element should be the desired float
magicFloat = locateFloat[1]
return magicFloat
我遇到了一个问题:
magicFloat = locateFloat[1] IndexError: list index out of range
如果能给我一些关于如何找到这个浮点数并返回它的建议,那就太好了。
5 个回答
你可以使用正则表达式。
>>> st = "adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
>>> float(re.split(r':|\s|-',st)[-1])
1.5698464586545999
我用过re.split(pattern, string, maxsplit=0, flags=0)这个方法,它可以根据你设定的模式把字符串切分开。
这里的模式就是你用来分隔的符号,比如说:、空格(\s)、-
。
总是有一些问题。根据你的浮点数的样子(比如前面有0吗?)可以这样处理:
magicFloat = re.search('.*([0-9]\.[0-9]+)',st).group(1)
另外,如果你经常这样做,建议先编译一下正则表达式:
re_float = re.compile('.*([0-9]\.[0-9]+)')
# later in your code
magicFloat = re_float.search(st).group(1)
在Python中,字符串是不可变的。这意味着无论你对一个字符串调用什么函数,这个字符串的实际内容都不会改变。因此,像
rstrip
、replace
这样的函数会创建一个新的字符串,表示修改后的版本。(如果你看过文档就会知道这一点。)在你的代码中,前两条语句的结果没有被赋值到任何地方,所以这些结果就丢失了。如果不指定分割的次数,
rsplit
和split
的效果是一样的。它确实是从字符串的末尾开始检查分割点,但它还是会在每一个可能的地方进行分割,所以最终的效果是相同的。你需要明确告诉它最多只分割一次。不过,其实你也不需要这样做;有一种更简单的方法可以获取“最后一个冒号之后的所有内容,或者如果没有冒号则获取所有内容”,那就是使用
rpartition
。你实际上不需要去掉末尾的空白字符就可以进行
float
转换。虽然你可能应该去做这个转换。最后,单纯为了返回一个变量而赋值是没有意义的;直接返回表达式就可以了。
把这些结合起来,我们可以得到非常简单的代码:
def findFloat(stringArg):
return float(stringArg.replace('-', ':').rpartition(':')[2])