Регулярные выражения соответствуют группам цифр, за которыми следуют пробелы, слова или нет - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь сопоставить с регулярным выражением:

101.6 x 101.6 mm
150   x      150 mm
490 x 100 x 380 mm
490 x 100 x 380 x 430 mm
280mm x 260 mm

и извлечь значение (цифры) в виде отдельных групп. Я использую:

^(?P<value>[-\.\d]+)([\s]*)([x]+) 

, но я хочу что-то, что не заботится о том, сколько раз появляются цифры.

Что я хочу получить в виде групп:

101.6, 101.6, mm
150, 150, mm
490, 100, 380, mm
490, 100, 380, 430, mm
280, 260, mm

Я знаю, что это можно сделать с помощью split, как есть, но помимо приведенных выше примеров, у меня есть и другие выражения, содержащие "x", и в этом случае я не хочу разбивать.

1 Ответ

1 голос
/ 04 февраля 2020

Учитывая, что все строки в примере данных оканчиваются на mm и mm, могут также произвольно появляться после ди git, вы можете сопоставить необязательное вхождение и использовать положительный прогноз, чтобы утверждать, что строка также заканчивается с mm и тем, что между ними - только разрешенные части.

Если вы хотите сопоставить несколько пробелов, вы можете использовать [ ]+ с квадратными скобками в этом случае для ясности. Если может быть больше видов пробелов, кроме новой строки, вы можете использовать [^\S\r\n]*.

На основе нескольких пробелов вы можете использовать

\b(?P<value>\d+(?:\.\d+)?)(?: *mm)?(?=(?: +x +\d+(?:\.\d+)?)* mm\b)

Regex demo | Python демо

Например

import re

regex = r"\b(?P<value>\d+(?:\.\d+)?)(?: *mm)?(?=(?: +x +\d+(?:\.\d+)?)* mm\b)"

test_str = ("101.6 x 101.6 mm\n"
    "150   x      150 mm\n"
    "490 x 100 x 380 mm\n"
    "490 x 100 x 380 x 430 mm\n"
    "280mm x 260 mm")

print(re.findall(regex, test_str))

Выход

['101.6', '101.6', '150', '150', '490', '100', '380', '490', '100', '380', '430', '280', '260']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...