Извлечение корня, буквы месяца-года и желтого ключа из фьючерса Bloomberg

Фьючерсный тикер Bloomberg обычно выглядит так:

MCDZ3 Curcny

где корень MCD, буква месяца и год Z3 и "желтый ключ" Curcny,

Обратите внимание, что корень может быть переменной длины, 2-4 буквы или 1 буква и 1 пробел (например, S H4 Comdty). Буквенный год допускает только букву, указанную ниже в expr и может иметь две цифры года. Наконец, желтый ключ может быть одной из нескольких строк типа безопасности, но меня интересует (Curncy|Equity|Index|Comdty) только.

В Matlab у меня есть следующее регулярное выражение

expr = '[FGHJKMNQUVXZ]\d{1,2} '; 
[rootyk, monthyear] = regexpi(bbergtickers, expr,'split','match','once');

где

rootyk{:}
ans = 
    'mcd'    'curncy'

а также

monthyear = 
    'z3 '

Я не хочу совпадать с ' ' (пробелом) в месячном году. Как я могу сделать?

4 ответа

Решение

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

^([A-Z]{2,4}|[A-Z]\s)([FGHJKMNQUVXZ]\d{1,2}) (Curncy|Equity|Index|Comdty)$

У вас есть корень в первой группе, буква-год во второй, желтый ключ в третьей.

Я не знаю, Matlab и охватывает ли он Perl-совместимый Regex. Если это не удается, попробуйте, например, с вместо \s, Кроме того, бросьте ^...$ если вы хотите извлечь из большего исходного текста.

Выражение, которое вы кормите regexpi с содержит пробел и используется в качестве шаблона для 'match', Вот почему соответствует monthyear Строка также имеет пробел 1.

Если вы хотите, чтобы все было просто и regexpi сделайте всю работу за вас (вместо постобработки его вывода), попробуйте другой подход и перехватите токены вместо сопоставления и игнорируйте промежуточное пространство:

%//     <$1><----------$2---------> <$3>
expr = '(.+)([FGHJKMNQUVXZ]\d{1,2}) (.+)';
tickinfo = regexpi(bbergtickers, expr, 'tokens', 'once');

Вы также можете упростить выражение для более общего '(.+)(\w{1}\d{1,2})\s+(.+)' если хочешь.

пример

bbergtickers = 'MCDZ3 Curncy';
expr = '(.+)([FGHJKMNQUVXZ]\d{1,2})\s+(.+)'; 
tickinfo = regexpi(bbergtickers, expr, 'tokens', 'once');

Результат:

tickinfo =
    'MCD'
    'Z3'
    'Curncy'

1 Это выражение также используется в качестве разделителя для 'split' , Удаление заднего пробела из этого не поможет, так как он появится снова в rootyk вывод вместо.

Вот совершенно другой подход, в основном он ищет букву перед номером вашего года:

s = 'MCDZ3 Curcny'
p = regexp(s,'\d')
s(min(p)
s(min(p)-1:max(p))

Предполагая, что вы просто хотите избавиться от начальных и / или конечных пробелов на краю, для этого есть очень простая команда:

monthyear = trim(monthyear)

Для удаления всех пробелов вы можете сделать:

monthyear(isspace(monthyear))=[]
Другие вопросы по тегам