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



我知道这篇文章和这个库,但他们没有帮助我处理下面的这些特定案例。如何解析如下所示的测量值:

我有如下字符串;

"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"模型使用"命名实体识别"。但结果如下:

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

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

我还发现了这个正则表达式:

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

但是,如果输入包含 2 个维度,它确实会在结果列表中留下一个空值,如果数字和"x"之间没有空格,则它不起作用。我不擅长正则表达式...

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

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

在部分

  • (?<!S)负面回头,断言左侧的内容不是非空格字符
  • d+(?:,d+)?匹配 1+ 位数字
  • 以及可选的,和 1+ 位数字
  • ?x ?可选空格之间的匹配x
  • d+(?:,d+)?匹配 1+ 位数字以及可选的,和 1+ 位数字
  • (?:非捕获组
    • 在可选空格和 1+ 位数字之间?x ?d+Matchx'
    • (?:,d+)?可选匹配,和 1+ 数字
  • )*关闭非捕获组并重复 0+ 次

正则表达式演示 |蟒蛇演示

例如

import re
regex = r"(?<!S)d+(?:,d+)? ?x ?d+(?:,d+)?(?: ?x ?d+(?:,d+)?)*"
test_str = ("Square 10 x 3 x 5 mmn"
"Round 23/22; 24,9 x 12,2 x 12,3n"
"Square 10x2n"
"Straight 10x2mmn"
"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']

最新更新