#regex
#регулярное выражение
Вопрос:
В целях очистки текста я создал небольшое регулярное выражение для сопоставления чисел, за которыми следуют единицы измерения (используется в Бразилии):
^d{1,2},d{1,2}(cm|m(²|2)?|kg)$
https://regex101.com/r/i4rxS2/1/
Но я не знаю, как расширить его, чтобы соответствовать:
1,3x1,0x0,7cm
Как я могу это сделать?
Комментарии:
1. Спецификация для вашей расширенной версии неясна, но
^d{1,2},(?:dxd,){0,2}d{1,2}(cm|m(²|2)?|kg)$
или^d{1,2},(?:dxd,){2}?d{1,2}(cm|m(²|2)?|kg)$
наивно работает в вашем случае. Это то, что вы ищете?2. Возможно
^d*,(d*([x]d*)?,)*d*(cm|m(²|2)?|kg)$
? Это добавляет(d*([x]d*)?,)
, что будет соответствовать 0 или более [цифрам, затем anx
, затем цифрам]3.
^(dd?,dd?(?:c?m[²2]?|kg)?)(?:x(?1))*$
Может быть, полезно?
Ответ №1:
Это, вероятно, самый короткий ответ:
^(d{1,2},?x?) (cm|m(²|2)?|kg)$
Ответ №2:
Может быть, что-то вроде этого?
^d{1,2},d{1,2}(xd{1,2},d{1,2}){,2}(cm|m(²|2)?|kg)$
Ответ №3:
При необходимости сопоставьте формат для добавленного 1,3x1,0x
, и вы можете сократить чередование (²|2)
до класса символов [²2]
, соответствующего 1 из перечисленных символов.
^d{1,2},d{1,2}(?:(?:xd{1,2},d{1,2}){2})?(?:cm|m[²2]?|kg)$
Шаблон соответствует
^
Начало строкиd{1,2},d{1,2}
Сопоставьте 1-2 цифры,
и 1-2 цифры(?:(?:xd{1,2},d{1,2}){2})?
При необходимости сопоставьте дополнительный1,3x1,0x
шаблон(?:cm|m[²2]?|kg)
Не группа захвата для соответствия одной из альтернатив$
Конец строки
Демонстрация регулярных выражений
Этого нет в данных примера, но использование d{1,2},d{1,2}
не соответствует, если, например, в нем нет десятичной части 2kg
. В этом случае вы могли бы сделать эту часть необязательной, используя d{1,2}(?:,d{1,2})?
Ответ №4:
Ваше начальное регулярное выражение предполагает, что за всеми числами следует единица измерения. Это не относится к многомерным измерениям, где за целым «набором» чисел следует одна единица. (Мы проигнорируем тот факт, что XxYxZcm
это сомнительная аббревиатура для XcmxYcmxZcm
.)
Кроме того, я бы опустил ^
и $
из регулярного выражения для измерений и добавил их только тогда, когда вы, наконец, сопоставите со строкой.
>>> import re
>>> number = r'd{1,2},d{1,2}'
>>> unit = r'(cm|m(²|2)?|kg)'
>>> measurement = f'({number})(x({number}))*{unit}'
>>> re.match(rf'^{measurement}
, "1,3cm")
<re.Match object; span=(0, 5), match='1,3cm'>
>>> re.match(rf'^{measurement}
, "1,3x1,0x0,7cm")
<re.Match object; span=(0, 13), match='1,3x1,0x0,7cm'>