3

Python 正規表現を取得して .c ファイルを検索し、その中の関数を取得しようとしています。

例えば:

int blahblah(
  struct _reent *ptr __attribute__((unused)),
  const char    *old,
  const char    *new
)
{
...

関数として取得したいと思いblahblahます。

この正規表現は私にはうまくいきませんNoner"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{"

4

3 に答える 3

3

(?<=(int\s)|(void\s)|(string\s)|(double\s)|(float\s)|(char\s)).*?(?=\s?\()

http://regexr.com?3332t

これは、あなたが望むもののために働くはずです。キャッチする必要があるタイプを追加し続けるだけです。

re.findall(r'(?<=(?<=int\s)|(?<=void\s)|(?<=string\s)|(?<=double\s)|(?<=float\s‌​)|(?<=char\s)).*?(?=\s?\()', string)Pythonで動作します。

于 2012-12-09T11:57:05.027 に答える
3

引数の括弧 (具体的には の括弧__attribute__((unused))) が原因で、正規表現はそれをキャッチしません。この場合、正規表現を適応させることができるかもしれませんが、一般に、正規表現は C のような言語を解析できません。 pycparserのような本格的なパーサーを使用することをお勧めします。

于 2012-12-08T21:09:55.907 に答える
0

正規表現は、ソース コード ファイルから意味情報を抽出するための適切なツールではありません (構文の強調表示には適していますが、構文は正規表現で表現されることが多いため)。正規表現は、ネストされた構造を処理したり、何が起こっているかを追跡したり、型と記号を区別したりすることができません。

ctagsまたは など、言語構造を本当に認識している特殊なツールをお勧めしますpython-pygccxml

ctagsviは、C ソース内のエンティティのリストをその場所とともに生成するプログラムです (や などのテキスト エディタで C コード ベースをナビゲートするために使用されますemacs)。は、 gcc 内部を使用してコードを分析し、プログラムのセマンティクスに関する豊富で構造化された出力を生成するpython-pygccxmlC ライブラリへの Python バインディングです。libgccxml

于 2012-12-08T21:59:19.363 に答える