【问题标题】:get string with parsing in python list在python列表中通过解析获取字符串
【发布时间】:2015-07-13 13:34:28
【问题描述】:

我有这样的列表

["<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 中得到了这个列表。我让函数修改 scapy。
  • 源列表是 ['']
  • 我想使用 {CDC97813-CC28-4260-BA1E-F0CE3081DEC7} 获得 eth6
  • Scapy 没有给你一个字符串,它给你一个有属性的对象。如果您通过将其转换为字符串来保存它,那么您必须再次解析它,这很痛苦。为什么不首先保存您想要的值?

标签: python string list python-2.7 parsing


【解决方案1】:

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

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

或者,更好的是,如果您实际上在 Scapy 本身中使用它,只需将 dict 直接从 {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) 在循环中执行此操作以构建将数字映射到名称的 dict。 (3) 只需使用 dict 进行查找。

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

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

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'

【讨论】:

  • d = {match.group(2): match.group(1) for match in matches} 显示无效的语法错误..抱歉..
  • @user3683061:没有无效的语法错误。至少在 Python 2.7 中,这是您声称正在使用的。
  • @user3683061:另外,请注意,我给您的模式是针对您询问的玩具格式,而不是您拥有的真实格式。
【解决方案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}")

正则表达式很好,但是对于我这个菜鸟来说,正则表达式又是一个大问题……

【讨论】:

    【解决方案3】:

    代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2012-08-22
      相关资源
      最近更新 更多