我创建了一个pythod方法,它将接受一个可变长度的字符串,它总是包含一个浮点数:
"adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
OR
"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:列表索引超出范围
任何关于如何定位浮动并将其返回的指导都会很棒。
答案 0 :(得分:1)
总是摇滚。取决于您的浮点数是什么样的(前导0?),如:
magicFloat = re.search('.*([0-9]\.[0-9]+)',st).group(1)
P.S。如果你这么做,请先编译正则表达式:
re_float = re.compile('.*([0-9]\.[0-9]+)')
# later in your code
magicFloat = re_float.search(st).group(1)
答案 1 :(得分:1)
在Python中,字符串是不可变的。无论您在字符串上调用什么函数,该字符串的实际文本都不会更改。因此,rstrip
,replace
等方法会创建表示修改后版本的 new 字符串。 (如果您阅读文档,您会知道这一点。)在您的代码中,您不会在前两个语句中的任何位置分配这些调用的结果,因此结果将丢失。
在未指定多个拆分的情况下,rsplit
执行与split
完全相同的操作。它确定从末端检查分裂,但它仍然在每个可能的点分裂,因此净效果是相同的。您需要指定最多拆分一次。
但是,你不应该这样做;获取“最后一次冒号后的所有内容,或者没有冒号的所有内容”的更简单方法是使用rpartition
。
您实际上不必从float
转换的末尾删除空格。虽然您可能确实应该执行转换。
最后,分配给变量只是为了返回它没有意义;直接返回表达式。
将它们放在一起会让我们非常简单:
def findFloat(stringArg):
return float(stringArg.replace('-', ':').rpartition(':')[2])
答案 2 :(得分:0)
您可以更轻松地完成这项工作:
def findFloat(stringArg):
s = stringArg.rstrip()
return s.split('-:')[-1]
if ':' in stringArg:
。 希望这些提示可以在以后帮助你:)
答案 3 :(得分:0)
您可以使用regular expressions。
>>> st = "adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
>>> float(re.split(r':|\s|-',st)[-1])
1.5698464586545999
我使用了re.split(pattern, string, maxsplit=0, flags=0),它按照模式的出现来分割字符串。
此处模式是您的分隔符,如:,white-space(\s),-
。
答案 4 :(得分:0)
如果它总是在最后,你应该在你的re:
中使用$
import re
def findFloat(stringArg):
fl = re.search(r'([\.0-9]+)$', stringArg)
return fl and float(fl.group(1))