【问题标题】:Perl: Regular Expression for certain complex charactersPerl:某些复杂字符的正则表达式
【发布时间】:2013-08-06 05:07:07
【问题描述】:

我是 Perl 的初学者,有一段数据如下:

ATOM    2067  N    SER 7  316   -2.78500  -0.14800  -0.01300 N_R    3 0 -0.47000 0   0
ATOM    2068 HN    SER 7  316   -2.51586   0.06218   0.89490 H___A  1 0  0.31000 0   0
ATOM    2069  CA   SER 7  316   -3.57800  -1.36200  -0.28500 C_3    4 0  0.07000 0   0

我希望能够将每行中没有 H_ 的数据打印到另一个文件行。您能帮我找出正则表达式中的错误吗?

while (<localBGF>)
{
      $line = $_;
      if ($line =~ /^ATOM\s+\d+\s+(\S+)\s+SER/)
      {

          if ($line !~ /^ATOM\s+\d+\s+(\S+)\s+SER\s+\d\s+\d\s+\d\s+\d\s+\d\s+H_/)
          {
               print BGF $line;
          }

      }
}

【问题讨论】:

  • 为什么不直接做$line =~ s/H_//g;
  • 另外,您使用的是strictwarnings
  • @JackManey:我想他想检查行首:ATOM 1234...
  • 当一行包含H__时,第三个字段是否也包含H(当且仅当)?
  • 错误是你在一些\d之后缺少+,而且\d匹配数字0-9所以\d+不会匹配-0.01300,因为它没有t 匹配 -.

标签: regex perl


【解决方案1】:

由于您已经使用第一个正则表达式确定该行与 ^ATOM\s+\d+\s+(\S+)\s+SER 第二个匹配,您只需检查 $line !~ /.*H_.*/

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多