【问题标题】:Parsing a long string in python在python中解析一个长字符串
【发布时间】:2015-09-01 11:34:33
【问题描述】:

我正在尝试在 python 中使用正则表达式解析一个长字符串。 字符串是这样的:

 Output = "Name:AmelieAge:30Nationality:english"

基本上,字段名称是固定的,但我可以使用包含重复数据的更复杂的字符串,例如:

  Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish"

我正在寻找一种方法来获得这样的结构化数据:

Name:Amelie
Age:30
Nationality:english

Name:David
Age:50
Nationality:Irish

如果您有任何关于使用正则表达式来解析这个长字符串的建议。

仅供参考:字符串大小随意

【问题讨论】:

  • 字符串是否总是有姓名、年龄和国籍
  • 你已经知道字段名了吗?
  • 请告诉我们您的尝试。除非输入并不总是像您提供的那样,否则这似乎并不难。
  • 您必须提供更多信息,例如。如果字段名称是固定的或遵循特定的逻辑

标签: python regex


【解决方案1】:

试试:

>>> re.findall("[A-Z][a-z]+\:[\w\d][a-z\d]+", Output)
['Name:Amelie', 'Age:30', 'Nationality:english']

我假设所有键都以大写字母开头,而 Values 除了第一个字母外没有大写字母。

【讨论】:

  • 这将失败,并使用像 Jean Pierre 这样的组合名称
  • Jean Pierre 已经是一个歧义,因为您可能也将其理解为像 OP 示例中的值键 AmelieAge
  • 除了Pierre 后面没有: 或字符串的结尾。
【解决方案2】:
re.findall("[A-Z]\w+:[\d\w]+(?=[A-Z]\w+|$)", Output)

使用前瞻断言是最好的方法。此正则表达式将捕获以大写字母开头并以小写或大写形式继续的字符串,然后是:,之后它将捕获任何数字或字母,直到留下一个以大写字母开头并以字母开头或直到结尾的字符组已到达文本。

即使在@bigOTHER 的 cmets 中所说的情况下,这也将正确捕获组。

【讨论】:

    【解决方案3】:

    您可以从字符串创建一个字典列表,如下所示:

    import re, itertools
    
    Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish"
    
    entries = []
    i_split = iter(re.split("(Name|Nationality|Age):", Output)[1:])
    
    for entry in iter(lambda: list(itertools.islice(i_split, 6)), []):
        i_entry = iter(entry)
        d_entry = {k:next(i_entry) for k in i_entry}
        entries.append(d_entry) 
    
    # Display the whole list
    print entries
    print
    
    # Display entries one at a time
    for entry in entries:
        for k, v in entry.items():
            print "{}:{}".format(k,v)
        print   
    

    这会给你一个输出:

    [{'Nationality': 'english', 'Age': '30', 'Name': 'Amelie'}, {'Nationality': 'frensh', 'Age': '20', 'Name': 'Nike'}, {'Nationality': 'Irish', 'Age': '50', 'Name': 'david'}]
    
    Nationality:english
    Age:30
    Name:Amelie
    
    Nationality:frensh
    Age:20
    Name:Nike
    
    Nationality:Irish
    Age:50
    Name:david  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2011-06-20
      • 2015-04-08
      • 2013-03-21
      • 2013-09-01
      相关资源
      最近更新 更多