Извлечение корня, буквы месяца-года и желтого ключа из фьючерса 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))=[]