在 perl 中解释正则表达式

Posted

技术标签:

【中文标题】在 perl 中解释正则表达式【英文标题】:interpreting regular expression in perl 【发布时间】:2013-12-31 14:20:05 【问题描述】:

我正在尝试对 Perl 脚本进行逆向工程。其中一行包含一个匹配的运算符,内容如下:

$line =~ /^\s*^>/ 

输入只是带有标题信息的 FASTA 序列。我相信,该脚本正在标题中寻找特定的模式。

以下是应用脚本的文件示例:

>mm9_refGene_NM_001252200_0 range=chr1:39958075-39958131 5'pad=0 3'pad=0 strand=+ 
repeatMasking=none
ATGGCGAACGACTCTCCCGCGAAGAGCCTGGTGGACATTGACCTGTCGTC
CCTGCGG

>mm9_refGene_NM_001252200_1 range=chr1:39958354-39958419 5'pad=0 3'pad=0 strand=+ 
repeatMasking=none
GACCCTGCTGGGATTTTTGAGCTGGTGGAAGTGGTTGGAAATGGCACCTA
TGGACAAGTCTATAAG

这是一个匹配运算符,询问该行是否从一开始就包含至少大于零的空格,但随后我失去了它的意义。

到目前为止,这就是我解析正则表达式的方式:

从开头 [ (/^... ] 开始,包含至少大于零的空格 [ ...\s... ] [ ...*... 。

【问题讨论】:

最后的 ^ 是什么意思? ^ 不会出现在任何空格之后的标题中。因此,^ 符号必须修改正则表达式中的某些内容。我不明白它在做什么。空格后跟 ^ 是什么意思? @BoristheSpider - 我相信 ^ 只有在被转义时才会被匹配为文字 (\^)。 由于 fasta 记录总是以“>”开头,因此判断何时遇到新记录的一种方法是 /^>/。我怀疑/^\s*^>/ 的作者是指/^>/,因为作者也匹配fasta 记录的开头。你会在很多生物信息学 Perl 脚本中看到 /^>/ 就是为了这个目的。 啊,@Kenosis,你过去一直很有帮助!您是否同意最初编写的正则表达式不仅在寻找 >,而且还在寻找 > 之前的拼写错误或额外的空格? 【参考方案1】:

使用RegexBuddy(或r3mus said,regex101.com,免费):

Assert position at the beginning of the string «^»
Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Assert position at the beginning of the string «^»
Match the character “>” literally «>»

编辑:如果有问题的正则表达式实际上是错误的,Birei's answer 可能更正确。

【讨论】:

您使用 RegexBuddy 网站解决了它的含义? 不,这是我使用的 Windows 应用程序。非常适合构建、测试和理解正则表达式。 @r3mus - 是的,非常正确。也就是说,我是在 yeaaarrrrrrs 前买的,它肯定是有回报的(而且所有更新都是免费的)。 问题中写的正则表达式是它在脚本中的编写方式,实际上工作得很好(尽管我正在学习如何)。 regex101.com 网站告诉我,这基本上意味着您的答案所传达的内容。【参考方案2】:

你必须去掉第二个^ 字符。它是一个元字符,表示一行的开头(没有像 /m 这样的特殊标志),但这意味着它已经用第一个实现了。

字符 > 将在行首匹配而没有第二个 ^,因为初始空格是可选的(* 量词)。所以,使用:

$line =~ /^\s*>/ 

【讨论】:

我的脚本有效,所以如果你是正确的,也许第二个 ^ 是多余的,或者正则表达式的第一部分没用?我现在看到这个正则表达式的目的是找到与 > 相关的行。因此,我对原始正则表达式的解释是查找包含空格的行,然后返回行首(第二个 ^)并尝试匹配 >。对吗? @ES55:据我了解,是的,它是正确的。第二个^ 是多余的,但不是第一部分。我猜它还尝试匹配在第一个字符 > 之前有空格的行,可能是拼写错误、格式错误或类似的东西。 我没有注意到这一点。我认为你是对的,它正在寻找错别字之类的东西!【参考方案3】:

使用调试器对 perl 脚本进行逆向工程要容易得多。 “perl -d script.pl”或者如果你有 Linux ddd:“ddd cript.pl &”。

对于多行正则表达式,此正则表达式匹配带有空格的空行并开始下一个 FASTA。 http://www.rexfiddle.net/c6locQg

【讨论】:

以上是关于在 perl 中解释正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式+perl扩展正则

如何将正则表达式捕获存储在 Perl 的数组中?

perl 正则表达式 模糊匹配

了解 Perl 正则表达式修饰符 /m 和 /s [重复]

10-正则表达式-grep

Perl正则表达式引用