如何在匹配模式之前和之后从文本文件中获取文本字符串?

时间:2018-10-25 22:52:02

标签: string perl

我有一个名为mytext.txt的文本文件。我想从同一行的字符串Query:之前和之后的文件中捕获文本的刺痛。

mytext.txt:

   # P-value cutoff: 1
    # Category cutoff: 4
    # Output Format: Pretty
    ---------------------------------------------------

    5' UGGGAGGAUGGGAUGGGAAAG 3' Transcript: Supercontig_2.10_1111019:1499-1519 Slice Site:1510
       ||oo||o| o|o|| o|||||
    3' ACUUUCUUUUCUUAAUCUUUC 5' Query: Seq_2171_593

    SiteID: Supercontig_2.10_1111019:1510
    MFE of perfect match: -26.00
    MFE of this site: -18.70
    MFEratio: 0.719230769230769
---------------------------------------------------

5' GUUUGGAAAGGCGGUUACGGGG 3' Transcript: Supercontig_2.10_1257006:252-273 Slice Site:264
   |oo||||||o||||||  o|oo
3' CGGACCUUUUCGCCAAGAUCUU 5' Query: Seq_5744_249

SiteID: Supercontig_2.10_1257006:264

这是我尝试的代码:

#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use Modern::Perl;


my $word = "Query";

my $filename = $ARGV[0];
open(INPUT_FILE, $filename);
while (<INPUT_FILE>) {
chomp;
#for my $word (@words) {
        my ($before, $after) = $_ =~ /(\S+)(?:\t\Q$word\E\t)(\S+)/i;
        say "word: $word\tbefore: $before\tafter: $after";
#    }
}

我想要的结果:

3' ACUUUCUUUUCUUAAUCUUUC 5'   Seq_2171_593
3' CGGACCUUUUCGCCAAGAUCUU 5'  Seq_5744_249

PS。我可以使用其他各种方法来完成此操作,例如unix one衬垫,但是我正在学习perl,并且希望在perl中完成此操作。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

\S character class与空格字符以外的其他任何字符匹配。您需要除换行符(.)之外的所有内容。您的单词后面有一个:,它的正则表达式需要说明。最后\t仅匹配一个制表符,在您要查找的单词前后是否有实际的制表符?

my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;

作为旁注,readline运算符(<> / <<>>)默认使用特殊的ARGV文件句柄,它将打开并从指定为参数的每个文件中读取,因此您不必从@ARGV获取文件名并自己打开它,只需执行以下操作:

while (<<>>) { ... }

(如果您的Perl早于5.22,则必须使用while (<>),它不太安全,因为它允许执行作为参数传递的命令;出于类似的原因,您自己打开文件时应使用always use three-arg open。)< / p>