从 Python 3 中的给定字符串解析测量值(多维)
Parse measurements (multiple dimensions) from a given string in Python 3
我知道 this post and this 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']]]
我不知道如何正确地从此列表中提取这些测量值。
我还找到了 正则表达式:
>>>re.findall("(\d+(?:,\d+)?) x (\d+(?:,\d+)?)(?: x (\d+(?:,\d+)?))?", "Straight 10 x 2 mm")
<class 'list'>: [('10', '2', '')]
但如果输入包含 2 个维度,它确实会在结果列表中留下一个空值,如果数字和 "x"s 之间没有空格,它就不起作用。我不擅长正则表达式...
对于给定的示例,您可以使用:
(?<!\S)\d+(?:,\d+)? ?x ?\d+(?:,\d+)?(?: ?x ?\d+(?:,\d+)?)*
部分
(?<!\S)
负向回顾,断言左边的不是非空白字符
\d+(?:,\d+)?
匹配 1+ 个数字和可选的 ,
和 1+ 个数字
?x ?
在可选空格之间匹配 x
\d+(?:,\d+)?
匹配 1+ 个数字和可选的 ,
和 1+ 个数字
(?:
非捕获组
?x ?\d+
Match
x` 介于可选空格和 1+ 个数字之间
(?:,\d+)?
可选择匹配一个 ,
和 1+ 个数字
)*
关闭非捕获组并重复0+次
例如
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']
我知道 this post and this 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']]]
我不知道如何正确地从此列表中提取这些测量值。
我还找到了
>>>re.findall("(\d+(?:,\d+)?) x (\d+(?:,\d+)?)(?: x (\d+(?:,\d+)?))?", "Straight 10 x 2 mm")
<class 'list'>: [('10', '2', '')]
但如果输入包含 2 个维度,它确实会在结果列表中留下一个空值,如果数字和 "x"s 之间没有空格,它就不起作用。我不擅长正则表达式...
对于给定的示例,您可以使用:
(?<!\S)\d+(?:,\d+)? ?x ?\d+(?:,\d+)?(?: ?x ?\d+(?:,\d+)?)*
部分
(?<!\S)
负向回顾,断言左边的不是非空白字符\d+(?:,\d+)?
匹配 1+ 个数字和可选的,
和 1+ 个数字?x ?
在可选空格之间匹配x
\d+(?:,\d+)?
匹配 1+ 个数字和可选的,
和 1+ 个数字(?:
非捕获组?x ?\d+
Match
x` 介于可选空格和 1+ 个数字之间(?:,\d+)?
可选择匹配一个,
和 1+ 个数字
)*
关闭非捕获组并重复0+次
例如
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']