Как расширить регулярное выражение для одной единицы измерения, чтобы оно также соответствовало мере «единица х единица х единица»?

#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 или более [цифрам, затем an x , затем цифрам]

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