0

我正在尝试将此正则表达式从 Perl 转换为 Python:

if ($line !~ /^\*NODE/i || $line !~ /^\*ELEMENT OUTPUT/i)
{
    print $line;
}

我已经编写了这个 Python 代码,但它失败了:

if (re.search("^!\*ELEMENT OUTPUT | ^!\*NODE", line)):
   print line
4

3 回答 3

4

准确的翻译是:

node_pattern = re.compile("^\*NODE", re.I)
element_pattern = re.compile("^\*ELEMENT OUTPUT", re.I)

if (not re.search(node_pattern, line) or not re.search(element_pattern, line)):
    print line

根据您要尝试做的事情or,中间可能会更好,and但如果不了解整个问题,我无法确定。希望这可以帮助!

于 2012-08-28T06:27:00.120 回答
0

在 python 中,有比正则表达式更好的方法:

if not line.lower().startswith ('*node') or not line.lower ().startswith ('*element output'):
    print (line)
于 2012-08-28T15:20:48.357 回答
0

在我看来,原文的逻辑是错误的。我想这样做的目的是只打印不开头或不带*NODE或不带*ELEMENT OUTPUT(不区分大小写)的行。但是,该条件适用于任何行。如果它开始于*NODE那么它不会开始于*ELEMENT OUTPUT,反之亦然。这样,条件总是被评估为True

结论,在原著中一定有and代替。or

此外,您必须使用原始字符串(例如r'your pattern'在 Python 中,或者您必须将反斜杠加倍。我相信,您不想在正则表达式中加倍反斜杠。

您可以尝试以下代码段:

import re

simulated_file_content = [
  'line 1\n',
  '*NODE line 2\n',
  'line 3\n',
  '*eLeMent Output line 4\n',
  'line 5\n',
  ]


rex = re.compile(r'^\*(NODE)|(ELEMENT OUTPUT)', re.IGNORECASE)


for line in simulated_file_content:
    line = line.rstrip()
    if not rex.search(line):
        print line

它显示:

c:\tmp\___python\FaisalSashmi\so12153650>python a.py
line 1
line 3
line 5
于 2012-08-29T10:28:40.557 回答