我正在尝试将此正则表达式从 Perl 转换为 Python:
if ($line !~ /^\*NODE/i || $line !~ /^\*ELEMENT OUTPUT/i)
{
print $line;
}
我已经编写了这个 Python 代码,但它失败了:
if (re.search("^!\*ELEMENT OUTPUT | ^!\*NODE", line)):
print line
我正在尝试将此正则表达式从 Perl 转换为 Python:
if ($line !~ /^\*NODE/i || $line !~ /^\*ELEMENT OUTPUT/i)
{
print $line;
}
我已经编写了这个 Python 代码,但它失败了:
if (re.search("^!\*ELEMENT OUTPUT | ^!\*NODE", line)):
print line
准确的翻译是:
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
但如果不了解整个问题,我无法确定。希望这可以帮助!
在 python 中,有比正则表达式更好的方法:
if not line.lower().startswith ('*node') or not line.lower ().startswith ('*element output'):
print (line)
在我看来,原文的逻辑是错误的。我想这样做的目的是只打印不开头或不带*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