2

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

我当前的函数parse只能处理只有mm值的字符串,但如果mm英寸值都存在则不能。

任何帮助是极大的赞赏!

正则表达式模式: 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'
4

3 回答 3

2

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

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

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

于 2019-10-16T14:53:14.257 回答
1

您可以搜索匹配的模式,而不是使用 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]
于 2019-10-16T14:57:58.600 回答
1

实际上,您可能会告诉 regex 捕获正好在mm整个单词之前的 float/int 值:

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

在线查看正则表达式演示

这里,

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

请参阅Python 演示

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) )
于 2019-10-16T16:43:48.180 回答