正規表現を作成して、コード内のすべての関数呼び出しを見つけることができます。このような何か:
([_a-zA-Z]+)(?=\()
その後re
モジュールを使用して、あなたのコード内の関数呼び出しをインデックスのデータ構造を作成します。
[
('predicate', 0, 9),
('foo', 10, 13),
('predicate', 21, 30),
('foo', 31, 34),
('predicate', 52, 61),
('foo', 62, 65),
('predicate', 73, 82),
('foo', 83, 86),
('predicate', 104, 113),
('foo', 114, 117),
('predicate', 125, 134),
('foo', 135, 138)
]
あなたは、各関数呼び出しの括弧の中身を引き出すためにparse
機能と連動して、このデータ構造を使用することができます。
import re
code = 'predicate(foo(x.bar, predicate(foo(...), bar)), bar)predicate(foo(x.bar, predicate(foo(...), bar)), bar)predicate(foo(x.bar, predicate(foo(...), bar)), bar)'
code_cp = code
regex = re.compile(r'([_a-zA-Z]+)(?=\()')
matches = re.findall(regex, code)
structured_matches = []
for m in matches:
beg = str.index(code, m)
end = beg + len(m)
structured_matches.append((m, beg, end))
code = code[:beg] + '_' * len(m) + code[end:]
これはあなたにこのように見えるのデータ構造を提供します。
[
('predicate', 'foo(x.bar, predicate(foo(...), bar)), bar'),
('foo', 'x.bar, predicate(foo(...), bar)'),
('predicate', 'foo(...), bar'), ('foo', '...'),
('predicate', 'foo(x.bar, predicate(foo(...), bar)), bar'),
('foo', 'x.bar, predicate(foo(...), bar)'),
('predicate', 'foo(...), bar'), ('foo', '...'),
('predicate', 'foo(x.bar, predicate(foo(...), bar)), bar'),
('foo', 'x.bar, predicate(foo(...), bar)'),
('predicate', 'foo(...), bar'),
('foo', '...')
]
がうまくいけば、これが正しい方向にあなたを指す:最後に
def parse(string):
stack = []
contents = ''
opened = False
for c in string:
if len(stack) > 0:
contents += c
if c == '(':
opened = True
stack.append('o')
elif c == ')':
stack.pop()
if opened and len(stack) == 0:
break
return contents[:-1]
paren_contents = []
for m in structured_matches:
fn_name, beg, end = m
paren_contents.append((fn_name, parse(code_cp[end:])))
、
paren_contents
は次のようになります。
[この回答](http://stackoverflow.com/a/24696831/2272638)は右につながるかもしれません方向?まだ十分なコーヒーは、私が答えを投稿したいと思っています。 – dwanderson
Pythonの 're'モジュールはここで必要とする再帰やバランスを扱うことができません。 ['regex'モジュール(PyPI)](https://pypi.python.org/pypi/regex)をインストールできますか? –
@dwanderson悲しいことに、(または私はIDを取得しません)それは同等の量のparanthesesに一致しようとすると、それはちょうど(とa) – weidler