从Python 3中的给定字符串解析度量(多维)

问题描述 投票:1回答:1

我知道this postthis library,但在下面的这些特定情况下他们没有帮助我。我如何解析如下测量结果:

我有下面的字符串;

"Square 10 x 3 x 5 mm"
"Round 23/22; 24,9 x 12,2 x 12,3"
"Square 10x2"
"Straight 10x2mm"

我正在寻找Python软件包或某种方式来获得如下所示的结果;

>>> a = amazing_parser.parse("Square 10 x 3 x 5 mm")
>>> print(a)
10 x 3 x 5 mm

同样;

>>> a = amazing_parser.parse("Round 23/22; 24,9x12,2")
>>> print(a)
24,9 x 12,2

我还尝试通过“ ner_ontonotes_bert_mult”模型使用“ named entity recognition”。但是结果如下:

>>> from deeppavlov import configs, build_model
>>> ner_model = build_model(configs.ner.ner_ontonotes_bert_mult, download=True)
>>> print(ner_model(["Round 23/22; 24,9 x 12,2 x 12,3"]))
<class 'list'>: [[['Round', '23', '/', '22', ';', '24', ',', '9', 'x', '12', ',', '2', 'x', '12', ',', '3']], [['O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL', 'O', 'B-CARDINAL']]]

我不知道如何从此列表中正确提取这些度量。

我也找到了this正则表达式:

>>>re.findall("(\d+(?:,\d+)?) x (\d+(?:,\d+)?)(?: x (\d+(?:,\d+)?))?", "Straight 10 x 2 mm")
<class 'list'>: [('10', '2', '')]

但是,如果输入包含2个维,则它确实在结果列表中保留一个空值,并且如果数字和“ x”之间没有空格,则它不起作用。我对正则表达式不好...

regex python-3.x parsing units-of-measurement ner
1个回答
2
投票

对于给定的示例,您可以使用:

(?<!\S)\d+(?:,\d+)? ?x ?\d+(?:,\d+)?(?: ?x ?\d+(?:,\d+)?)*

部分

  • (?<!\S)负向后看,断言左侧的内容不是非空格字符
  • [\d+(?:,\d+)?匹配1个以上的数字,并可选地匹配,和1个以上的数字
  • [ ?x ?在可选空格之间匹配x
  • [\d+(?:,\d+)?匹配1个以上的数字,并可选地匹配,和1个以上的数字
  • (?:非捕获组
    • ?x ?\d+Matchx`在可选空格和1+个数字之间
    • [(?:,\d+)?可选地匹配,和1+个数字
  • [)*关闭非捕获组并重复0次以上

Regex demo | Python demo

例如

import re

regex = r"(?<!\S)\d+(?:,\d+)? ?x ?\d+(?:,\d+)?(?: ?x ?\d+(?:,\d+)?)*"
test_str = ("Square 10 x 3 x 5 mm\n"
    "Round 23/22; 24,9 x 12,2 x 12,3\n"
    "Square 10x2\n"
    "Straight 10x2mm\n"
    "Round 23/22; 24,9x12,2")
result = re.findall(regex, test_str)
print(result)

输出

['10 x 3 x 5', '24,9 x 12,2 x 12,3', '10x2', '10x2', '24,9x12,2']
© www.soinside.com 2019 - 2024. All rights reserved.