【问题标题】:Extract Float Values from String in Python (and possibly using Regex)从 Python 中的字符串中提取浮点值(可能使用正则表达式)
【发布时间】:2019-10-16 14:49:29
【问题描述】:

我在创建一个函数时遇到问题,该函数接受一个包含长度值的字符串(例如:'32.0 mm / 1.259"`)并仅返回 mm 中的值。

我当前的函数parse 只能处理只有 mm 值的字符串,但不能处理 mminches值存在。

非常感谢任何帮助!

正则表达式模式: re.sub("[^0-9.\-]", "", str)

import re

def parse(str):
    if not str:
        return None
    str = str.lower()
    return float(re.sub("[^0-9.\-]", "", str))

tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']
for s in tests: 
    print( parse(s) )

预期输出

12.3
12.3
32.0
32.0

实际输出

12.3
12.3
ValueError: could not convert string to float: '32.01.259'

【问题讨论】:

  • 能否请您看一下答案并选择最适合您的答案?有一些解决方案,例如 1) 删除所有以 mm 开头的数字,2) 在 mm 之前提取数字。 My solutionDaniel's 非常相似,但在5. mmorph 的情况下不提取数字。因为我使用的是单词边界,所以我的解决方案也适用于 mm 之前的整数。

标签: python regex python-3.x


【解决方案1】:

只需将您的正则表达式模式简化为以下内容:

re.sub("mm.*", "", str)

...你会得到预期的输出

【讨论】:

    【解决方案2】:

    您实际上可以告诉正则表达式捕获一个浮点/整数值,该值正好位于 mm 整个单词之前:

    re.search(r"([0-9]+(?:\.[0-9]+)?)\s*mm\b", text.lower())
    

    请参阅regex demo online

    这里,

    • ([0-9]+(?:\.[0-9]+)?) - 第 1 组:1+ 位,后跟可选的 . 和 1+ 位序列
    • \s* - 0+ 个空格
    • mm\b - mm 和一个单词边界。

    Python demo

    import re
    
    def parse(text):
        if not text:
            return None
        match = re.search(r"([0-9]+(?:\.[0-9]+)?)\s*mm\b", text.lower())
        if match:
            return float(match.group(1))
        return text
    
    tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']
    for s in tests: 
        print( parse(s) )
    

    【讨论】:

      【解决方案3】:

      您可以搜索匹配的模式,而不是使用 sub,例如:

      import re
      
      
      def parse(s):
          if not s:
              return None
          s = s.lower()
          return float(re.search("(\d+\.\d*\s*)mm", s).group(1))
      
      
      tests = ['12.3 mm', '12.3mm', '32.0 mm / 1.259"', '32.0mm / 1.259"']
      
      print([parse(test) for test in tests])
      

      输出

      [12.3, 12.3, 32.0, 32.0]
      

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2018-07-11
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多