如何使用Python(re)解析格式化字符串

0 投票
5 回答
1016 浏览
提问于 2025-04-17 14:48

我想处理的字符串是"{average:12.1km/ltr}"。我想从这个字符串中提取出12.1。我知道的唯一方法是用split(":")和split("km/ltr"),但这些方法似乎不太好用。我想用类似scanf的方式来提取12.1,但在Python的文档中说,用正则表达式比用scanf的方式更好。我之前以为正则表达式不能用来提取数据。那我该怎么用re来提取呢?

5 个回答

1

只需要把你不想要的字符都去掉就行了,没必要用复杂的正则表达式(不过我个人是喜欢正则表达式的...)

>>> import string
>>> s = "{average:12.1km/ltr}"
>>> s2 = s.strip(string.ascii_letters + "{}:/")
>>> print s2
12.1
>>> number = float(s2)
>>> print number
12.1
1

试试这个,假设这个数字可能没有小数点。

import re
re.findall('[0-9]+(\.[0-9]+)?', str)
1

我觉得你可以简单地用下面的方法从字符串中提取数字部分。

  • 关键是,字符串中只有一个数字,并且这个数字中间可能有一个小数点。
  • 小数点是可选的,因为你的数字可能是一个整数。
  • 你也可能会遇到带有小数的数字。

下面是一个示例

>>> re.findall("\d+\.?\d*|\.\d+",st)
>>> st = "{average:12.1km/ltr}"
>>> re.findall("\d+\.?\d*|\.\d+",st)
['12.1']
>>> st = "{average:12km/ltr}"
>>> re.findall("\d+\.?\d*|\.\d+",st)
['12']
>>> st = "{average:.5km/ltr}"
>>> re.findall("\d+\.?\d*|\.\d+",st)
['.5']
>>> st = "{average:12.km/ltr}"
>>> re.findall("\d+\.?\d*|\.\d+",st)
['12.']
>>> st = " {max:26.9kgm@6100rpm}"
>>> re.findall("\d+\.?\d*|\.\d+",st)
['26.9', '6100']

撰写回答