<p>你有一个嵌套的语法,你正在试图分析。尽管它的范围很窄,所以可以构造regex<em>来处理它,但它将是脆弱的。就像,<em>真的</em>脆弱。你知道吗</p>
<p>尝试使用<code>ast</code>。这变得有点复杂,所以我将尝试(哈哈)通过一个例子。太长了,读不下去了。你知道吗</p>
<p>我们正在列表节点中查找一个名称,因此可以从那里开始。你知道吗</p>
<pre><code>import ast
s = "candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])"
mod = ast.parse(s)
for node in ast.walk(mod):
if isinstance(node, ast.List):
print(node, list(ast.iter_child_nodes(node)))
<_ast.List object at 0xb3f2ddec> [<_ast.Call object at 0xb3f2de0c>, <_ast.Load object at 0xb712756c>]
<_ast.List object at 0xb3f2deec> [<_ast.Name object at 0xb3f2df0c>, <_ast.Load object at 0xb712756c>]
<_ast.List object at 0xb3f2df2c> [<_ast.Name object at 0xb3f2df4c>, <_ast.Load object at 0xb712756c>]
</code></pre>
<p>我们看到语法树中有三个<code>ast.List</code>节点。第一个是调用<code>ev</code>的外部列表,两个内部列表将包含那些空的<code>ast.Name</code>节点。这就是我们想要的-你特别想要第二个。你知道吗</p>
<hr/>
<P> <强> TL;博士跳过<<强> </p>
<p>我们可以让这一切变得更加简单,我只是简单介绍一下我个人是如何探索这个语法树的。这里有一个简单的例子:</p>
<pre><code>s = "candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])"
mod = ast.parse(s)
[next(ast.iter_fields(node)) for node in ast.walk(mod) if isinstance(node, ast.Name)]
Out[62]: [('id', 'candidates'), ('id', 'ev'), ('id', 'stenosis'), ('id', 'patf')]
</code></pre>
<p>所以只要抓住最后一个元素的第二个索引,这就是你的字符串。这种方法也适用于您的另一个示例:</p>
<pre><code>s = "candidates(8,1,0,7,[ev(-875,'C0003501','Aortic Valve','Aortic valve structure',[aortic,valve],[bpoc])])"
mod = ast.parse(s)
[next(ast.iter_fields(node)) for node in ast.walk(mod) if isinstance(node, ast.Name)]
Out[65]:
[('id', 'candidates'),
('id', 'ev'),
('id', 'aortic'),
('id', 'valve'),
('id', 'bpoc')]
</code></pre>
<p>您可以使用这种方法从语法树中获取任何想要的元素。只需使用<code>ast.iter_fields</code>和<code>ast.iter_child_nodes</code>探索<code>ast.walk</code>的输出。你知道吗</p>