簡體   English   中英

特定字符串的Perl正則表達式

[英]perl regex for specific string

我想將字符串分成不同的列。 每行如下所示。

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"按特定的字符匹配進行"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];
    }

使用否定的前瞻分割不帶 “字母數字”的下划線。

嘗試拆分此正則表達式:

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

查看與正則表達式匹配的實時正則表達式演示

兩次拆分可能使您更輕松:

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"

那是您要找的東西嗎?

過度使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM