3

我有以下输入:

>> 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'and 'CAGGTG'。我有这个代码来接他们:

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

它返回零。

有人可以帮忙解决两个问题吗?

问候,A。

4

2 回答 2

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'
于 2012-10-02T19:01:09.733 回答
1

您可以尝试匹配而不是拆分:

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

现在 match 将包含两个单元格数组:

>> 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'
于 2012-10-02T19:15:02.787 回答