Python регулярное выражение, не соответствует, если - PullRequest
1 голос
/ 27 апреля 2020

Извините за несколько бесполезный заголовок, мне очень трудно объяснить эту проблему.

У меня есть список уникальных идентификаторов, которые могут появляться разными способами, и я пытаюсь использовать регулярные выражения для их нормализации, чтобы я мог сравнить несколько баз данных. Вот несколько примеров из них:

AB1201
AB-1201
AB1201-T
AB-12-01L1
AB1201-TER
AB1201 Transit

Я написал строку кода, которая вытаскивает все знаки и пробелы, и использовал это регулярное выражение:

([a-zA-Z]{2}[\d]{4})(L\d|Transit|T$)?

Это работает точно как и ожидалось, возвращает список, похожий на этот:

AB1201
AB1201
AB1201T
AB1201L1
AB1201
AB1201T

Проблема в том, что у меня есть один идентификатор, который выглядит так: AB1201-02. Мне нужно, чтобы это поднималось как исключение, а не как совпадение.

Есть идеи? Я рад предоставить дополнительные разъяснения, если это необходимо. Спасибо!

От онлайн-тестера Regex101

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Вы можете исключить сопоставление следующего дефиса и ди git (?!-\d), используя отрицательный прогноз.

Если он должен начинаться с начала строки, вы можете использовать якорь ^

Обратите внимание, что вы можете написать [\d] как \d

^([a-zA-Z]{2}\d{4})(?!-\d)(L\d|Transit|T$)?

Шаблон будет выглядеть так:

  • ^ Начало строки
  • ( Захват группа 1
    • [a-zA-Z]{2}\d{4} Совпадение 2 раза a-zA-Z и 4 цифры
  • ) Закрыть группа
  • (?!-\d) Отрицательный взгляд, утверждающий, что прямо направо не -, а ди git
  • (L\d|Transit|T$)? Дополнительный захват группа 2

Regex demo

0 голосов
/ 27 апреля 2020

Попробуйте это регулярное выражение

^([a-zA-Z]{2}[\d]{4})(?!-\d)(L\d|Transit|T|-[A-Z]{3})?$

Я добавил (?!...) Negative Lookahead, чтобы избежать совпадения с -02.

(?! ...) Negative Lookahead : Начиная с текущей позиции в выражении, гарантирует, что данный шаблон не будет совпадать. Не использует символы.

Вы можете просмотреть демонстрацию по этой ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...