Skip to main content
 首页 » 编程设计

python之通过在 python 列表中解析获取字符串

2025年05月04日21luoye11

我有这样的列表

["<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" 

我已经在搜索...但我找不到...抱歉...

我怎么能这样?

请您参考如下方法:

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

文档中没有描述 NetworkInterface 对象(因为它是特定于 Windows 的代码的实现细节),但您可以像 Python 中的任何其他类一样以交互方式检查它(例如,dir(ni) 会显示所有属性),或者只看 the source .您需要的值为 name 和 win_name。因此,不要使用 print ni,而只需执行类似 print '%s,%s' % (ni.name, ni.win_name) 的操作。然后,在其他程序中解析结果将变得微不足道,而不是令人头疼。

或者,更好的是,如果您实际上在 Scapy 本身中使用它,只需直接从 {ni.win_name: ni.name for ni in nis} 中生成字典。 (或者,如果你在 Python 2.5 或其他平台上运行 Scapy,dict((ni.win_name, ni.name) for ni in nis)。)


但要回答您提出的问题(也许您已经捕获了所有数据,现在捕获新数据为时已晚,所以现在我们无法解决您之前的错误……),需要三个步骤: (1) 弄清楚如何将其中一个字符串解析为其组成部分。 (2) 在循环中执行此操作以构建一个将数字映射到名称的字典。 (3) 只需使用字典进行查找。

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

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

Regular expression visualization

Debuggex Demo

现在,让我们构建字典:

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} 

现在:

>>> d['20092973'] 
'student'