【问题标题】:interpreting regular expression in perl在 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,你过去一直很有帮助!您是否同意最初编写的正则表达式不仅在寻找 >,而且还在寻找 > 之前的拼写错误或额外的空格?

标签: regex string perl string-matching


【解决方案1】:

使用RegexBuddy(或r3mus saidregex101.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多