Разбор измерений (нескольких измерений) из заданной строки в Python 3 - PullRequest
1 голос
/ 25 сентября 2019

Мне известны эта публикация и эта библиотека , но они не помогли мне с этими конкретными случаями ниже.Как я могу проанализировать измерения, как показано ниже:

У меня есть строки, подобные приведенным ниже;

"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

Likewise;

>>> 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" нет пробела.Я плохо разбираюсь в регулярных выражениях ...

1 Ответ

2 голосов
/ 25 сентября 2019

В приведенных примерах вы можете использовать:

(?<!\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+ раз

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