2012-10-02 35 views
3

我有以下输入:MATLAB:正则表达式和分裂,并挑选一些细胞

>> data(1).Header 
ans = 
    AF051909 |392-397:CAGCTG| |413-418:CAGGTG| 

我需要将它们保存到细胞{'392-397', 'CAGCTG'; '413-418', 'CAGGTG';}

我,所以我用正则表达式用下面这样做代码:

struKm(1).trueBinding = regexp(data(1).Header,'\s\||\:|\|','split'); 

这将返回:

>> struKm(1).trueBinding 
ans = 
    'AF051909' '392-397' 'CAGCTG' '' '413-418' 'CAGGTG' '' 

你可以看到有空的单元格,我试着找出它们为什么在那里但失败了。

我也试过忽略它,并继续拿起我需要的其余代码'CAGCTG''CAGGTG'。我有这个代码来接他们:

[r1,r2] = ismember(struKm(1).trueBinding,set) 

它返回零。

有人可以帮助两个问题吗?

问候,A.

回答

1

我假设你只是想提取该单元阵列仅有的两个核苷酸序列。如果是这样的情况下,这似乎工作:

atgc = @(str) (sum(lower(str)==97 | lower(str)==116 | lower(str) == 103 ... 
    | lower(str) == 99)==numel(str)) && numel(str)~=0; 
data(1).Header = 'AF051909 |392-397:CAGCTG| |413-418:CAGGTG|'; 
result1 = regexp(data(1).Header,'\s\||\:|\|','split'); 
results = result(cellfun(atgc,result1)) 

这给

results = 

    'CAGCTG' 'CAGGTG' 
1

你可以尝试匹配,而不是分裂:

match = regexp(data(1).Header,'\|(.*?):(.*?)\|','tokens'); 

现在比赛将包含两个单元阵列:

>> match 
match = 
    {1x2 cell} {1x2 cell} 

哪个哟ü可以像这样访问:

>> match{1} 
ans = 
    '392-397' 'CAGCTG' 
>> match{2} 
ans = 
    '413-418' 'CAGGTG' 

要获得单元阵列,该单元阵列到您最初请求的形式,你可以这样做:

>> struKm(1).trueBinding = cat(1,match{:}) 
struKm(1).trueBinding = 
    '392-397' 'CAGCTG' 
    '413-418' 'CAGGTG'