Регулярное выражение Python для соответствия страницам печати и их диапазону

#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. Хм, ты прав. Должно быть, я что-то неосознанно отредактировал.. Мои извинения.