【问题标题】:How to parse a formatted string using Python(re)如何使用 Python(re) 解析格式化的字符串
【发布时间】:2013-02-05 09:45:24
【问题描述】:

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

【问题讨论】:

  • "regular express不能用于提取"为什么不呢?

标签: python regex python-3.x


【解决方案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']

【讨论】:

  • 这个案例怎么样:{max:26.9kgm@6100rpm}? 26.9和6100应该如何使用命令解压?
  • @joshkugler:我已经用你的例子更新了我的答案,看来这种情况也会得到处理。
  • @joshkugler 您尚未定义这些字符串的格式。如果我们修改我们的正则表达式以匹配它,那么您可以稍后返回并找到另一个不起作用的输入。我的意思是:在您的问题中提供一些输入示例,以及您希望从每个示例中提取哪些数字。
  • 我不得不为此道歉,描述清楚并不容易。实际上格式不是我关心的,因为有几种格式。我真正想知道的是如何从一个字符串中提取几个子字符串。我知道如何编写正则表达式模式(语法),但我不知道如何使用 python re API 完成这项任务。
  • re.findall("(\d+\.?\d)kgm@(\d+\.?\d)rpm",str) 可能更健壮
【解决方案2】:

只需strip所有你不想要的字符 - 不需要正则表达式(虽然我喜欢它们......)

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

【讨论】:

    【解决方案3】:

    试试这个,假设数字可以不带点。

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

    【讨论】:

      【解决方案4】:

      又脏又快怎么样

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

      这适用于您的示例。

      【讨论】:

        【解决方案5】:

        你说你试过split(":")split("km/ltr"),所以我假设字符串的格式总是像:__X__km/ltr,其中__X__是一个数字。

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

        :(\d.+)km
        

        例子:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 2021-09-17
          • 2015-04-10
          • 1970-01-01
          • 1970-01-01
          • 2020-06-11
          • 1970-01-01
          相关资源
          最近更新 更多