【问题标题】:parsing string with specific name in python在python中解析具有特定名称的字符串
【发布时间】:2015-05-04 02:12:05
【问题描述】:

我有这样的字符串

<name:john student male age=23 subject=\computer\sience_{20092973}>

我很困惑 ":","="

我要解析这个字符串!

所以我想拆分成这样的列表

name:john
job:student
sex:male
age:23
subject:{20092973}

在 python 中解析具有特定名称(姓名、工作、性别等)的字符串

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

我怎么会这样?

谢谢。

【问题讨论】:

    标签: python string list python-2.7 parsing


    【解决方案1】:

    提供多个您尝试解析的字符串的示例通常是一个好主意。但我会猜测一下。看起来您的格式非常简单,并且主要以空格分隔。使用正则表达式很简单,就像这样,line_to_parse 是您要解析的字符串:

    import re
    matchval = re.match("<name:(\S+)\s+(\S+)\s+(\S+)\s+age=(\S+)\s+subject=[^\{]*(\{\S+\})", line_to_parse)
    matchgroups = matchval.groups()
    

    现在 matchgroups 将是您想要的值的元组。将它们转换为所需的格式对您来说应该是微不足道的。

    如果你想做很多这样的事情,编译正则表达式可能是值得的;查看re 文档了解更多信息。

    至于表达式的工作方式:我一般不会讨论正则表达式(这就是 re 文档的用途)但在这种情况下,我们希望得到一堆没有的字符串它们中的任何空格,并且它们之间有空格,我们想要对主题做一些奇怪的事情,忽略除 { 和 } 之间的部分之外的所有文本。

    表达式中的每个“(...)”都将其中的所有内容保存为一个组。每个 "\S+" 代表一个或多个 ("+") 不是空格 ("\S") 的字符,因此 "(\S+)" 将匹配并保存一个长度至少为一个没有空格的字符串在里面。每个 "\s+" 的作用相反:它周围没有括号,因此它不保存匹配的内容,并且匹配一个或多个 ("+") 空白字符 ("\s")。这足以满足我们想要的大部分内容。但是,最后,我们需要处理这个主题。 "[...]" 允许我们列出多种类型的字符。 "[^...]" 很特别,可以匹配任何不存在的内容。 {、像[、(等)在字符串中需要转义才能正常,所以我们用\转义,最后就是说“[^{]*”匹配零 em> 或更多 ("*") 不是 "{" ("[^{]") 的字符。因为 "*" 和 "+" 是 "贪婪的",并且会尝试尽可能多地匹配并且仍然有表达式匹配,我们现在只需要处理最后一部分。从我之前讲的内容来看,“({\S+})”的作用应该很清楚了。

    【讨论】:

    • 谢谢。好的,我会尝试使用正则表达式!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多