从Bloomberg期货股票代码中提取根,月份字母和黄色密钥

时间:2013-12-16 17:57:55

标签: regex matlab bloomberg

彭博期货的股票代码通常如下:

MCDZ3 Curcny

根目录为MCD,月份字母和年份为Z3,“黄色键”为Curcny

请注意, root 可以是可变长度,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 个答案:

答案 0 :(得分:2)

假设根目录中没有前导空格或尾随空格,只有大写字母,这应该有效:

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

你已经在第一组获得了根,第二组是第二年,第三组是黄键。

我不知道Matlab,也不知道它是否涵盖了Perl Compatible Regex。如果失败,请尝试例如使用代替\s。另外,如果您想从更大的源文本中提取,请删除^...$

答案 1 :(得分:2)

您正在为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输出中。

答案 2 :(得分:0)

假设您只想摆脱边缘处的前导或尾随空格,有一个非常简单的命令:

monthyear = trim(monthyear)

要删除所有空格,您可以执行以下操作:

monthyear(isspace(monthyear))=[]

答案 3 :(得分:0)

这是一种完全不同的方法,基本上会在您的年份编号之前搜索字母:

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