2011-06-22 23 views
0

私はthis question earlierに尋ねましたが、私は正しく表現していませんでした。私は、これらの3つのケースを持っている場合:コメント内にないメソッド名はどのようにして見つけることができますか?

void aMethod(params ...) 
//void aMethod(params 
// void aMethod(params 
^can have any number of spaces here 

がどのように私は、文字列はコメントで見つからなかった場合にのみ、私の正規表現が一致して微調整することができますか?これは私の正規表現です:

re.search("(?<!\/\/)\s*void aMethod",buffer) 

は、このすべてをキャッチします:

(?<!\/\/)(?<!\s)+void onMouseReleased 
+4

これらは唯一のケースですか? '/ * foo void aMethod(params)bar * /'(複数行コメント)と '' foo void aMethod(params)bar "(文字列リテラル) –

+0

Pythonはトークナイザを持っていませんか? – KingCrunch

+0

@Bartでは、複数行は表示されません。 – Geo

答えて

3

これはあなたの例のためのものを行う必要があります。

re.search("^(?!\/\/)\s*void aMethod",line) 
+0

私はちょうど興味があります、負のlookbehind解決策は可能でしょうか? – Geo

+0

@Geo、no、背後には幅が固定されている必要があるため。だから、 '\ s *'や '\ s +'をルックバックの中に入れることはできません。 –

+0

はい、私は固定幅について知っています。しかし、見た目の裏は、スペースの見た目のように+で繰り返すことはできませんでしたか? – Geo

1

は、正規表現を使用するには、いずれかの特定の必要性はありますか?ない場合は、以下を使用しようとすることができます:lazyrコメントあたりとして編集

a = """void aMethod(params ...) 
//void aMethod(params 
// void aMethod(params 
^can have any number of spaces here""" 

for line in a.split('\n'): 
    if not line.strip().startswith("//") and "void aMethod(params" in line: 
     print line 

+2

これは 'void aMethod(params //')を除外し、除外すべき 'var =" asdf aMethod asdf "を含みます。代わりに空白スペースがない場合にのみ動作します: 'void aMethod(params'。 –

+0

@怠け者、ありがとう、編集済み –

1

あなたはコメントを無視したい場合は、私は「前処理」ファイルは無視する/最初としてコメントを削除することをお勧めステップ。参照:Python snippet to remove C and C++ comments

関連する問題