2015-05-04 20 views
1

我想將字符串拆分爲不同的列。每行顯示如下。特定字符串的perl正則表達式

TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1|  97.56 82  2  0  1  246  9  90  7e-51  167 

我可以通過空格,製表符和「|」進行分割。但我無法通過特定的字符匹配將第一部分的其餘部分拆分爲"TR10052|c9_g13_i6_DESeqResultsBacterialen=248"。我想要第一列是TR #####片,第二列是c#_g#_i#片,第三列是以「_DESeq ...」開頭的其餘部分。

while (my $line = <RESULTS>) { 
    chomp $line; 
    my @column  = split(/[\t|] /_DES.*/ /, $line); 
    my $transcriptID = $column[0]; 
    my $isoform  = $column[1]; 
    my $deseq  = $column[2]; 
    } 

回答

2

兩個裂口可能使你更容易:

my ($transcriptID, $rest) = split(/\|/, $line, 2); 
my ($isoform, $deseq) = split (/_DESeq/, $rest, 2); 
$deseq = "_DESeq$deseq"; 

變換:

"TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1| 97.56 82 2 0 1 246 9 90 7e-51 167" 

分爲:

"TR10052", "c9_g13_i6", "_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1| 97.56 82 2 0 1 246 9 90 7e-51 167" 

這是你在找什麼?

3

使用負面展望分割的下劃線是而不是後跟「字母數字」。在此正則表達式

嘗試分裂:

/\||\_(?![a-z]\d)|\s+/ 

參見live regex demo匹配在其上分裂所需的字符。

1

很容易過度使用split。在這種情況下,我認爲通過編寫自定義正則表達式模式來提取所需字段會更好。

像這樣

use strict; 
use warnings; 

while (<DATA>) { 
    my ($transcript_id, $isoform, $deseq) = /^ ([^|]+) \| (c\d+_g\d+_i\d+) _ (\S+)/x; 
    print $_, "\n" for $transcript_id, $isoform, $deseq; 
} 

__DATA__ 
TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1|  97.56 82  2  0  1  246  9  90  7e-51  167 

輸出

TR10052 
c9_g13_i6 
DESeqResultsBacterialen=248 
相關問題