我想這正則表達式在Perl轉換到Python:如何將perl正則表達式轉換爲python?
if ($line !~ /^\*NODE/i || $line !~ /^\*ELEMENT OUTPUT/i)
{
print $line;
}
我寫了這Python代碼,但它失敗:
if (re.search("^!\*ELEMENT OUTPUT | ^!\*NODE", line)):
print line
我想這正則表達式在Perl轉換到Python:如何將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
但我不能s不知道更多關於整個問題。希望這可以幫助!
在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