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

如何使用Python解析格式化字符串(re),python,regex,python-3.x,Python,Regex,Python 3.x,我想要解析的字符串类似于“{average:12.1km/ltr}”。我想从这个字符串中提取12.1。我知道的唯一方法是使用split(“:”)和split(“km/ltr”)左右,但它们似乎没有什么用处。我想使用类似scanf的方法来提取12.1,但在python文档中,它表明使用正则表达式比使用类似scanf的函数要好。我认为在提取过程中不能使用正则表达式。我应该如何使用re来提取它?我认为您可以简单地使用以下命令从字符串中提取数字部分 诀窍是,有一个且只有一个数字之间有一个句点 句点可以

我想要解析的字符串类似于“{average:12.1km/ltr}”。我想从这个字符串中提取12.1。我知道的唯一方法是使用split(“:”)和split(“km/ltr”)左右,但它们似乎没有什么用处。我想使用类似scanf的方法来提取12.1,但在python文档中,它表明使用正则表达式比使用类似scanf的函数要好。我认为在提取过程中不能使用正则表达式。我应该如何使用re来提取它?

我认为您可以简单地使用以下命令从字符串中提取数字部分

  • 诀窍是,有一个且只有一个数字之间有一个句点
  • 句点可以是可选的,因为数字可以是一个整数
  • 您可能还会遇到分数
这是样品

>>> 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']

我认为您可以简单地使用以下命令从字符串中提取数字部分

  • 诀窍是,有一个且只有一个数字之间有一个句点
  • 句点可以是可选的,因为数字可以是一个整数
  • 您可能还会遇到分数
这是样品

>>> 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']

又脏又快怎么样

re.findall('[\d.]+',s)

这适用于您的示例

又脏又快怎么样

re.findall('[\d.]+',s)

这适用于您的示例

只需
strip
您不需要的所有字符-不需要正则表达式(尽管我喜欢它们…)


只需
strip
所有您不需要的字符-不需要正则表达式(尽管我喜欢它们…)


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

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

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

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

您说过您尝试了
拆分(“:”
拆分(“km/ltr”)
,因此我假设字符串的格式总是类似于
:\uuuuuuuuuuu km/ltr
,其中
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu km/ltr>是一个数字

以下正则表达式将起作用:

:(\d.+)km
例如:

>>> import re
>>> re.findall(':(\d.+)km', '{average:12.1km/ltr}')
['12.1']
>>>

然后,您可以使用
float()
函数将其解析为float。

您说过您试图
拆分(“:”
拆分(“km/ltr”)
,所以我假设字符串的格式总是类似于
:\uuuuuuuuuuukm/ltr
,其中
\uuuuuuuuuuuuuuuuuuuuuuu
是一个数字

以下正则表达式将起作用:

:(\d.+)km
例如:

>>> import re
>>> re.findall(':(\d.+)km', '{average:12.1km/ltr}')
['12.1']
>>>

然后,您可以使用
float()
函数将其解析为float。

“正则表达式不能用于提取”为什么不?“正则表达式不能用于提取”为什么不?这种情况如何:{max:26。9kgm@6100rpm}? 如何使用命令提取26.9和6100?@joshkugler:我已经用你的例子更新了我的答案,似乎这个场景也会得到处理。@joshkugler你还没有定义这些字符串的格式。如果我们修改正则表达式以匹配它,那么您可以稍后返回并找到另一个不起作用的输入。我的意思是:在你的问题中给出一些输入示例,你希望从每个示例中提取哪些数字。对此我深表歉意,要清楚地描述它并不容易。实际上,格式不是我所关心的,因为有几种格式。我真正想知道的是如何从一个字符串中提取几个子字符串。我知道如何编写正则表达式模式(grammer),但我不知道如何使用python re API.re.findall((\d+\.?\d)kgm@(\d+\.?\d)rpm),str)来完成这项任务。关于这种情况,{max:26。9kgm@6100rpm}? 如何使用命令提取26.9和6100?@joshkugler:我已经用你的例子更新了我的答案,似乎这个场景也会得到处理。@joshkugler你还没有定义这些字符串的格式。如果我们修改正则表达式以匹配它,那么您可以稍后返回并找到另一个不起作用的输入。我的意思是:在你的问题中给出一些输入示例,你希望从每个示例中提取哪些数字。对此我深表歉意,要清楚地描述它并不容易。实际上,格式不是我所关心的,因为有几种格式。我真正想知道的是如何从一个字符串中提取几个子字符串。我知道如何编写正则表达式模式(grammer),但我不知道如何使用python re API.re.findall((\d+\.?\d)kgm@(\d+\.?\d)rpm),str)来完成这项任务可能更麻烦