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

私の意見では、オリジナルのロジックは間違っています。*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
于 2012-08-29T10:28:40.557 に答える
0

Python では、これを行うには正規表現よりも優れた方法があります。

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