所以这个标题听起来很奇怪,因为也许我的问题很奇怪。。。我有一个.txt文件,其中有来自不同程序的数千行机器输出,格式如下:
candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])
基本上,我们有“candidates”标记一个元组的开始,“ev”标记一个元素列表中第二个元组的开始。当我将所有这些从文件读入python时,它以字符串的形式读入。但是我需要一个对象,这样我就可以访问元组的第n个索引。真的,我很高兴能找到一种方法从这个字符串中一致地获得ev()元组的最后一个值,在本例中是“patf”。你知道吗
我曾考虑过在“,”上拆分,但这并不总是成功的,因为列表“[狭窄]”中的列表有时会有像“[反流,主动脉]”这样的值。这个额外的“,”将列表索引抛出1,因此它将返回“astorial]”,而不是“[patf]”。你知道吗
请让我知道,如果我可以澄清任何事情,或如果我认为一些知识是理所当然的,需要说,才能解决这个问题。非常感谢。我还包括下面的第二个示例,它说明了在','上拆分的问题。你知道吗
candidates(8,1,0,7,[ev(-875,'C0003501','Aortic Valve','Aortic valve structure',[aortic,valve],[bpoc])])
编辑:我想对象不需要是列表。相同格式的元组工作得很好。只要我能为我需要的信息不断引用一个索引。谢谢!你知道吗
编辑2:我使用python2.7.6
如果您的数据总是以相同的方式格式化,那么最快的方法就是使用正则表达式(module
re
),如果您知道如何进行格式化的话。你知道吗否则,这是一个相当难看的黑客,您可以尝试使用
eval
来“解析”数据。举个例子:就在[。因此,您可以执行s.split('[')[-1].split(']')[0],其中s是文件中的一行。。。你知道吗
你有一个嵌套的语法,你正在试图分析。尽管它的范围很窄,所以可以构造regex来处理它,但它将是脆弱的。就像,真的脆弱。你知道吗
尝试使用
ast
。这变得有点复杂,所以我将尝试(哈哈)通过一个例子。太长了,读不下去了。你知道吗我们正在列表节点中查找一个名称,因此可以从那里开始。你知道吗
我们看到语法树中有三个
ast.List
节点。第一个是调用ev
的外部列表,两个内部列表将包含那些空的ast.Name
节点。这就是我们想要的-你特别想要第二个。你知道吗<强> TL;博士跳过<<强>
我们可以让这一切变得更加简单,我只是简单介绍一下我个人是如何探索这个语法树的。这里有一个简单的例子:
所以只要抓住最后一个元素的第二个索引,这就是你的字符串。这种方法也适用于您的另一个示例:
您可以使用这种方法从语法树中获取任何想要的元素。只需使用
ast.iter_fields
和ast.iter_child_nodes
探索ast.walk
的输出。你知道吗相关问题 更多 >
编程相关推荐