Как сопоставить целую строку, если выполнены определенные условия

#regex

Вопрос:

Я много работаю, пытаясь изолировать размеры от строк, однако у меня возникли некоторые проблемы.

Текущий:

https://regex101.com/r/zbEtOU/1

Текущее регулярное выражение

^([a-z] d*(?:s*-s*[a-zd] [/-][a-zd] )?|d )

Примеры:

30/32

Исправлено 8 (32-36)

XS/S

м/л

1-2Й

с/м

0-3 М

32

Желаемый результат:

Я хочу изолировать первое значение от, но когда я сталкиваюсь со скобками, я хочу сопоставить эти значения.

Таким образом, фактический желаемый результат из примеров:

30/32 = 30

Исправлено 8 (32-36) = 32

XS/S = XS

m/l = m

1-2Y = 1-2Y (я предполагаю, что в этом случае нет способа вывести «1Y»? В противном случае он будет перекрываться с 1-2 М, вызывая путаницу, так как в этом случае 1 != 1. Когда это произойдет, я бы предпочел получить исходную строку) идеальный случай = 1Y

s/m = s

1-3 М = 1-3 М (я предполагаю, что в этом случае невозможно вывести «1 М»? Иначе это перекрывалось бы с 1-2Y, вызывая путаницу, так как в этом случае 1 != 1. Когда это произойдет, я бы предпочел получить исходную строку) идеальный случай = 1 м

32 = 32

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

У кого-нибудь есть хороший и простой способ решить мою проблему??

Все должно быть записано в группе 1 — иначе моя система не сможет его изолировать

Запуск в Python 3.7

Комментарии:

1. Почему это 1-2Y => 1Y и 1-3M => 1M ?

2.Существуют способы получить все значения, например, с помощью различных групп захвата. Что это за инструмент или язык? См., например ((d )[^()]*)|([^s/] )[/]|^(d )$|(d )-d ([A-Z]) regex101.com/r/pTcObM/1

3. 1-3 года означает 1-3 года, в то время как 1-3 года означает 1-3 месяца…

4. Попробуйте (?:^|.*()(d (?:-d [A-Za-z]{1,3})?|[A-Za-z]{1,3})b , посмотрите демонстрацию .

5. Идеальное решение! Спасибо!!

Ответ №1:

Вы можете использовать

 (?:^|.*()(d (?:-d [A-Za-z]{1,3})?|[A-Za-z]{1,3})b
 

Смотрите демонстрацию регулярных выражений.

Подробные сведения:

  • (?:^|.*() — начало строки или любых нулевых или более символов, отличных от символов разрыва строки, как можно больше, а затем ( символ
  • (d (?:-d [A-Za-z]{1,3})?|[A-Za-z]{1,3}) — Группа 1:
    • d (?:-d [A-Za-z]{1,3})? — одна или несколько цифр, за которыми следует необязательное вхождение a - , одной или нескольких цифр, а затем от одной до трех букв ASCII
    • | — или
    • [A-Za-z]{1,3} — одна, две или три буквы ASCII
  • b — граница слов.