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'    ''

ご覧のとおり、空のセルがあり、それらが存在する理由を2つ見つけようとしましたが、失敗しました。

また、それを無視して、コードの残りの部分に必要なセルを取得し続けようとしまし'CAGCTG''CAGGTG'。私はそれらを拾うためにこのコードを持っています:

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

ゼロを返します。

誰かが2つの問題を手伝ってくれますか?

よろしく、A.

4

2 に答える 2

1

そのセル配列から 2 つのヌクレオチド配列だけを抽出したいだけだと思います。その場合、これはうまくいくようです:

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 には 2 つの cell 配列が含まれます。

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

次のようにアクセスできます。

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

この cell 配列の cell 配列を最初に要求した形式にするには、次のようにします。

>> struKm(1).trueBinding = cat(1,match{:})
struKm(1).trueBinding = 
    '392-397'    'CAGCTG'
    '413-418'    'CAGGTG'
于 2012-10-02T19:15:02.787 に答える