解析字符串以查找和删除浮动

时间:2012-02-13 23:14:27

标签: python string

我创建了一个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:列表索引超出范围

任何关于如何定位浮动并将其返回的指导都会很棒。

5 个答案:

答案 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)

  1. 在Python中,字符串是不可变的。无论您在字符串上调用什么函数,该字符串的实际文本都不会更改。因此,rstripreplace等方法会创建表示修改后版本的 new 字符串。 (如果您阅读文档,您会知道这一点。)在您的代码中,您不会在前两个语句中的任何位置分配这些调用的结果,因此结果将丢失。

  2. 在未指定多个拆分的情况下,rsplit执行与split完全相同的操作。它确定从末端检查分裂,但它仍然在每个可能的点分裂,因此净效果是相同的。您需要指定最多拆分一次。

  3. 但是,你不应该这样做;获取“最后一次冒号后的所有内容,或者没有冒号的所有内容”的更简单方法是使用rpartition

  4. 您实际上不必从float转换的末尾删除空格。虽然您可能确实应该执行转换。

  5. 最后,分配给变量只是为了返回它没有意义;直接返回表达式。

  6. 将它们放在一起会让我们非常简单:

    def findFloat(stringArg):
        return float(stringArg.replace('-', ':').rpartition(':')[2])
    

答案 2 :(得分:0)

您可以更轻松地完成这项工作:

def findFloat(stringArg):
    s = stringArg.rstrip()
    return s.split('-:')[-1]
  1. rstrip()将返回剥离的字符串,您必须将其存储在某处
  2. split()可以使用多个令牌,可以避免替换
  3. rsplit()是一种优化,但split()[ - 1]将始终采用拆分列表中的最新元素
  4. 如果没有找到rfind(),则
  5. locateFloat未定义
  6. 你需要找一个字符,你可以改为写if ':' in stringArg:
  7. 希望这些提示可以在以后帮助你:)

答案 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))