2016-04-15 11 views
4

objectから明示的に継承せずにPythonコードにクラスを見つけるためにregexを構築しようとしています。私を与え正規表現の一部を否定

import re 

test_string = ''' 
class Test(object): 
    pass 

class Test: 
    pass 
''' 

regex = r'class .*(?!\(object\)).*' 

re.compile(regex).findall(test_string) 

は:

'class Test(object):', 'class Test:' 

Regular expression visualization

Debuggex Demo

しかし、私は唯一の'class Test:'必要です。肯定先読みが正常に動作します。同時に

>>> print regex = r'class .*(?=\(object\)).*' 
['class Test(object):'] 

ここでの問題は何ですか?

+0

「ast」ではなく正規表現を使用する理由は何ですか?正規表現を使用するとバグが発生しやすくなります。 – Bharel

+0

@Bharelはgithub repos –

+0

@ xiからいくつかの統計を収集していますが、 'class test:...'と '' class test:... "'の間では分かりません。コメント、文字列、ドキュメントストリングのデータもすべてカウントされます: -/ – Bharel

答えて

2

あなたは「クラス」の後(?!.*\(object\))否定先読みを使用する必要があります。

class (?!.*\(object\)).* 

regex demo

.*(?!\(object\)).*サブパターンが(object)に従わないと改行以外の任意の0+の文字に一致参照してください。それは効果的にすべての行を終了まで把握し、その後には(object)が見つかりません。 2番目の.*は、すべての文字が最初に.*に属しているため、何も一致しません。 (?!.*\(object\))

、チェックがclass +スペースを消費した後に発生し、(object)はどこか、さらに現在のライン上にあり、一度試合を失敗しました。

関連する問題