Шаблон регулярных выражений для соответствия символу тикера

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь сопоставить символы тикера, которые имеют следующий формат:

Часть 1: Код идентификатора рынка (MIC), который используется для указания биржи, на которой торгуются ценные бумаги. Код уникален, включает в себя четыре символа и начинается с X, за которым следует трехзначный код для обозначения рынка, такой как XNAS для рынка Nasdaq.

Часть 1 отделяется от части 2 двоеточием.

Часть 2: Код тикера, состоящий из двух частей: (а) Код безопасности, который обычно имеет значение от 1 символа (F для Ford) до 5 символов (VFIAX для индекса Vanguard 500). Th (b) Необязательная часть, которая может быть дополнительно разделена на (i) Дату истечения срока действия, 6 цифр в формате yymmdd (ii) Тип опции, либо P, либо C, для пут или колл (iii) Цена исполнения, как цена x 1000, с добавлением от 0 до 8 цифр

Проблема, с которой мне нужно справиться, заключается в том, что при наличии необязательной части (иногда) код безопасности дополняется пробелами до 6 символов.

Итак, мне нужно сопоставить следующие допустимые тикеры:

 XLON:SBRY
XNAS:TSLA
XCME:SPX   141122P00019500
XNAS:AAPL200918C00032500
  

Мой regexfu не очень хорош, и это то, что мне удалось придумать до сих пор:

^(X)(A-Z){3}(:)(d|[A-Z]){1,6}s

Какое правильное регулярное выражение соответствует всем приведенным выше допустимым символам тикера и правильно соответствует частям?

Ответ №1:

Вы могли бы получить совпадения, используя:

 ^X[A-Z]{3}:[A-Z]{1,5}(?:s*d{6}[PC]d{8})?$
  

Демонстрация регулярных выражений

Немного более точное соответствие для месяца / дня и кода безопасности, дополненного пробелами до 6 символов, может быть:

 ^X[A-Z]{3}:[A-Z]{1,5}(?: {0,6}d{2}(?:0[1-9]|1[012])(?:0[1-9]|[12][0-9]|3[01])[PC]d{8})?$
  

Объяснение

  • ^ Начало строки
  • X[A-Z]{3}: Сопоставьте X, 3 символа A-Z и :
  • [A-Z]{1,5} Совпадение 1-5 раз от А до Я
  • (?: Не группа захвата
    • {0,6}d{2} Сопоставьте 0-6 пробелов и 2 цифры
    • (?:0[1-9]|1[012]) Сопоставьте месяц, часть 01-12
    • (?:0[1-9]|[12][0-9]|3[01]) Сопоставьте день, часть 01 — 31
    • [PC]d{8} Сопоставьте P или C и 8 цифр
  • )? Закройте группу и сделайте ее необязательной
  • $ Конец строки

Демонстрация регулярных выражений