Необязательная группа совпадений в начале регулярного выражения всегда пуста - PullRequest
1 голос
/ 14 апреля 2020

У меня есть строка asd@12A/AXB25017/12A@£££, из которой я хочу извлечь 12A/AXB25017/12A.

Я разработал шаблон регулярного выражения следующим образом

'.*(([A-Z0-9]+/)?[A-Z]{3}\d+(/[A-Z0-9]+)?)'

Поскольку у меня может быть много разных строк вариации. Допустимые варианты строк с разными буквами и цифрами, которые я хочу извлечь, могут быть.

1) AXB25017
2) 1/AXB25017
3) AXB25017/1
4) 1A/AXB25017
5) AXB25017/1A
6) EN/AXB25017
7) EN/AXB25017/1

Когда я делаю

 re.match('.*(([A-Z0-9]+/)?[A-Z]{3}\d+(/[A-Z0-9]+)?)','  @12A/AXB25017/12A@').group(1)

Он не находит начальные 12A/, но возвращает AXB25017/12A

Чего мне не хватает в моем паттерне, чтобы правильно поймать 12A/?

1 Ответ

3 голосов
/ 14 апреля 2020

Первая необязательная часть в вашем регулярном выражении ([A-Z0-9]+/)? не совпадает, потому что ...

  • это необязательно
  • предыдущее подвыражение 'match all' соответствует жадно

Включите разделители в регулярное выражение:

.*\@(([A-Z0-9]+/)?[A-Z]{3}\d+(/[A-Z0-9]+)?)

Если существует вероятность того, что материал следует за вторым разделителем, добавьте это в регулярное выражение ...

.*\@(([A-Z0-9]+/)?[A-Z]{3}\d+(/[A-Z0-9]+)?)\@

... что может позволить упрощение drasti c:

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