この正規表現を 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)