获取python列表中的解析字符串

时间:2015-05-04 08:12:43

标签: python string list python-2.7 parsing

我有这样的清单

["<name:john student male age=23 subject=\computer\sience_{20092973}>",
"<name:Ahn professor female age=61 subject=\computer\math_{20092931}>"]

我想让学生使用{20092973},{20092931}。

所以我想分成这样的列表

我的期望结果1是这个(输入是{20092973})

"student"

我的期望结果2是这个(输入是{20092931})

"professor"

我已经在搜索...但我找不到......对不起......

我怎么能这样?

3 个答案:

答案 0 :(得分:5)

我认为你不应该首先这样做。与您的玩具示例不同,您的真实问题不会涉及某种笨重格式的字符串;它涉及一个Scapy NetworkInterface对象。哪个属性可以直接访问。您只需要解析它,因为由于某种原因您存储了它的字符串表示形式。就是不要那样做;将它们作为属性存储时实际存储的属性。

文档中没有描述NetworkInterface对象(因为它是Windows特定代码的实现细节),但您可以像Python中的任何其他类一样以交互方式检查它(例如,{{1}会显示所有属性),或者只看{4}。您想要的值为dir(ni)name。因此,只需执行win_name之类的操作,而不是print ni。然后,在其他程序中解析结果将是微不足道的,而不是颈部疼痛。

或者,更好的是,如果您实际上在Scapy中使用它,只需直接从print '%s,%s' % (ni.name, ni.win_name)创建dict。 (或者,如果你在Python 2.5或其他东西上运行Scapy,{ni.win_name: ni.name for ni in nis}。)

但要回答这个问题(可能你已经捕获了所有数据,现在捕获新数据已经太晚了,所以现在我们不能解决你早先的错误......),有三个步骤: (1)弄清楚如何将其中一个字符串解析为其组成部分。 (2)在循环中执行此操作以构建将数字映射到名称的dict。 (3)只需使用dict进行查找。

对于解析,我会使用正则表达式。例如:

dict((ni.win_name, ni.name) for ni in nis)

Regular expression visualization

the source

现在,让我们建立一个字典:

<name:\S+\s(\S+).*?\{(\d+)\}>

现在:

r = re.compile(r'<name:\S+\s(\S+).*?\{(\d+)\}>')
matches = (r.match(thing) for thing in things)
d = {match.group(2): match.group(1) for match in matches}

答案 1 :(得分:2)

代码:

def grepRole(role, lines):   
    return [line.split()[1] for line in lines if role in line][0]

l = ["<name:john student male age=23 subject=\computer\sience_{20092973}>",
     "<name:Ahn professor female age=61 subject=\compute\math_{20092931}>"]
print(grepRole("{20092973}", l))
print(grepRole("{20092931}", l))

输出:

student
professor

答案 2 :(得分:2)

current_list = ["<name:john student male age=23 subject=\computer\sience_{20092973}>", "<name:Ahn professor female age=61 subject=\computer\math_{20092931}>"]

def get_identity(code):
    print([row.split(' ')[1] for row in current_list if code in row][0])


get_identity("{20092973}")

正则表达式很好,但对我来说,一个菜鸟,正则表达式是另一个大问题......