解析字符串以查找并移除浮点数

1 投票
5 回答
7279 浏览
提问于 2025-04-17 12:59

我创建了一个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 个回答

0

你可以使用正则表达式

>>> st = "adsfasdflkdslf:asldfasf-adslfk:1.5698464586546"
>>> float(re.split(r':|\s|-',st)[-1])
1.5698464586545999

我用过re.split(pattern, string, maxsplit=0, flags=0)这个方法,它可以根据你设定的模式把字符串切分开。

这里的模式就是你用来分隔的符号,比如说:、空格(\s)、-

1

总是有一些问题。根据你的浮点数的样子(比如前面有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)
1
  1. 在Python中,字符串是不可变的。这意味着无论你对一个字符串调用什么函数,这个字符串的实际内容都不会改变。因此,像 rstripreplace 这样的函数会创建一个新的字符串,表示修改后的版本。(如果你看过文档就会知道这一点。)在你的代码中,前两条语句的结果没有被赋值到任何地方,所以这些结果就丢失了。

  2. 如果不指定分割的次数,rsplitsplit 的效果是一样的。它确实是从字符串的末尾开始检查分割点,但它还是会在每一个可能的地方进行分割,所以最终的效果是相同的。你需要明确告诉它最多只分割一次。

  3. 不过,其实你也不需要这样做;有一种更简单的方法可以获取“最后一个冒号之后的所有内容,或者如果没有冒号则获取所有内容”,那就是使用 rpartition

  4. 你实际上不需要去掉末尾的空白字符就可以进行 float 转换。虽然你可能应该去做这个转换。

  5. 最后,单纯为了返回一个变量而赋值是没有意义的;直接返回表达式就可以了。

把这些结合起来,我们可以得到非常简单的代码:

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

撰写回答