この正規表現を 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
、問題全体についてもっと知らなければ確信が持てません。お役に立てれば!
私の意見では、オリジナルのロジックは間違っています。*NODE
意図は、開始されていない、または含まれていない、または含まれていない行のみを印刷することだったと思います*ELEMENT OUTPUT
(大文字と小文字を区別しません)。ただし、条件はどの行にも当てはまります。で始まる場合は*NODE
、で始まらず*ELEMENT OUTPUT
、その逆も同様です。このように、条件は常に に評価されTrue
ます。
結論から言うと、原作and
にもあるに違いない。or
また、生の文字列を使用する必要があります(r'your pattern'
Pythonのように、またはバックスラッシュを2倍にする必要があります。正規表現でバックスラッシュを2倍にしたくないと思います.
次のスニペットを試すことができます。
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
Python では、これを行うには正規表現よりも優れた方法があります。
if not line.lower().startswith ('*node') or not line.lower ().startswith ('*element output'):
print (line)