#python #regex #regex-lookarounds
Вопрос:
У меня есть это регулярное выражение, которое соответствует любым спецификациям печатной страницы (например: 6, 1-6, 6:4, 10-20/3)
^([1-9]d*)((?<=d)[-]|[:]?)((?<=-|:)?[1-9]d*)?(?:(?<=)([/]?))([1-9]d*)?$
и у меня он есть , так что в настоящее время он соответствует: например: 2048-4096/100, 15:10/3
Однако мое регулярное выражение также соответствует 5/3, когда / должно следовать только за двоеточием или тире и некоторыми цифрами, например 2048-4096/100
В пустом положительном взгляде в приведенном выше выражении я попытался: (?:(?<=[:|-]d)([/]?))
но это приводит к тому, что все мои тесты проваливаются, в результате чего совпадений нет. Я также пробовал (?:(?<=[:|-]d*)([/]?))
, но кванторы не разрешены в lookbehind.
Что я могу добавить в пустой положительный внешний вид, чтобы он проверял, находятся ли цифры a : или — и перед /?
Комментарии:
1. Какова цель
(?<=[-:])?
этого ? Если вам что-то понадобится дополнительно, просто удалите этот внешний вид.2. но кванторы не допускаются в поле зрения. ограничение встроенного модуля
re
заключается в том, что внешний вид должен быть фиксированной ширины, если вам нужен внешний вид переменной длины и разрешено использовать внешний модуль, посмотрите на регулярное выражение3. Я тоже только что осознал эту проблему. Я поместил это туда, чтобы соответствовать только числу (6, 3, 1000), но это создало еще одну проблему: 5: сопоставляется, когда этого не должно быть.
Ответ №1:
Вы можете использовать
^([1-9]d*)(?:([-:])([1-9]d*)(?:(/)([1-9]d*))?)?$
Смотрите демонстрацию регулярных выражений. Подробные сведения:
^
— начало строки([1-9]d*)
— Группа 1: ненулевая цифра, а затем ноль или более цифр(?:([-:])([1-9]d*)(?:(/)([1-9]d*))?)?
— необязательное возникновение([-:])
— Группа 2:-
или:
([1-9]d*)
— Группа 3: ненулевая цифра, а затем ноль или более цифр(?:(/)([1-9]d*))?
— необязательное возникновение(/)
— Группа 4:/
([1-9]d*)
— Группа 5: ненулевая цифра, а затем ноль или более цифр
$
— конец веревки.
Я сохранил все группы нетронутыми, но, по крайней мере (/)
, группа избыточна, так как шаблон исправлен как /
.
Комментарии:
1. Ах, я вижу, где я ошибся. Похоже, я слишком усложнял задачу, настаивая на использовании поиска. Я удалил парантезы из ( / ), потому что мне нужно, чтобы выражение было выполнено в пределах 4 групп, и ваше решение все еще совпадает. Спасибо вам за помощь!
2. @newbiecoder11 Справа, поисковые запросы в случаях, подобных этому, необходимы только в том случае, если часть регулярного выражения слева необязательна, и вы хотите сопоставить последующий шаблон только в том случае, если была сопоставлена левая часть. Это используется только при проверке ввода в реальном времени.
3. Отмеченный. Для вашего выражения 5: и 5 — все еще совпадают, когда этого не должно быть, и я сразу же подумал о том, чтобы использовать положительный взгляд вперед для цифр, прежде чем сопоставлять : или -, но теперь я предполагаю, что не должен?
4.@newbiecoder11
5:
и5-
НЕ соответствуют моему опубликованному регулярному выражению. Пожалуйста, скопируйте/вставьте его в сообщение.5. Хм, ты прав. Должно быть, я что-то неосознанно отредактировал.. Мои извинения.