#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 цифр
)?
Закройте группу и сделайте ее необязательной$
Конец строки