#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/13. 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
— граница слов.