【问题标题】:How to make a single list from lists when lists are results of a function?当列表是函数的结果时,如何从列表中创建一个列表?
【发布时间】:2017-11-30 22:38:20
【问题描述】:

我有类似的 json 文件:

{
    "level0name":{
      "level1name":[
        {
            "notkey":null,
            "key":"Some text 626 dollars."
        },
        {
            "notkey":null,
            "key":"Some text 3213 dollars."
        }
      ]
    }
}

和用正则表达式解析json的python代码

import json
import re
path = 'name.json'
def parser():
    with open(path, 'r') as jfile:
        data = json.loads(jfile.read())
        for i in data["level0name"]["level1name"]:
            try:
                all_messages = (i['key'])
                a = re.findall(u'[0-9]{1,}\sdollars.', all_messages)
                for i in a:
                    print(i)
            except KeyError:
                continue   
parser()

函数结果给了我很多类似的列表,但无法合并。

[625 dollars]
[3213 dollars]
[121 dollars]
[692 dollars]

我如何获得单个列表?也许我在解析时做错了什么? 只需要一个逗号分隔的列表。喜欢:

[625, 3213, 121, 692]

【问题讨论】:

    标签: python json list parsing


    【解决方案1】:

    您可以稍微更改您的正则表达式,以便在列表中包含一个积极的前瞻:

    import json
    import re
    path = 'name.json'
    def parser():
       with open(path, 'r') as jfile:
          data = json.loads(jfile.read())
          final_list = [] #for collecting the data
          for i in data["level0name"]["level1name"]:
             try:
                 all_messages = (i['key'])
                 a = re.findall(u'[0-9]{1,}(?=\sdollars\.)', all_messages)
                 if a:
                    final_list.append(int(a[0])) #append to final_list
             except KeyError:
                continue   
    parser()
    

    或者,您可以读取文件并应用正则表达式:

    import re
    final_data = map(int, re.findall('\d+(?=\sdollars\.)', open('path.json').read()))
    

    【讨论】:

    • 谢谢,第一个也返回许多列表,但是像:[625][625, 3213][625, 3213, 121][625, 3213, 121, 692]。第二个解决方案真的很好!谢谢)
    【解决方案2】:

    使用稍长的 JSON 输入文件:

    {
        "level0name":{
          "level1name":[
            {
                "notkey":null,
                "key":"Some text 626 dollars."
            },
            {
                "notkey":null,
                "key":"Some text 3213 dollars."
            },
            {
                "notkey":null,
                "key":"Some text 121 dollars."
            },
            {
                "notkey":null,
                "key":"Some text 692 dollars."
            }
          ]
        }
    }
    

    连同此代码:

    import json
    import re
    
    path = 'name.json'
    
    def parser():
        results = []
        with open(path, 'r') as jfile:
            data = json.loads(jfile.read())
            for i in data["level0name"]["level1name"]:
                try:
                    match = re.search(r'([0-9]{1,})\sdollars.', i['key'])
                    if match:
                        results.append(match.group(1))
                except KeyError:
                    continue
    
        return results
    
    print(parser())  # -> ['626', '3213', '121', '692']
    

    似乎做你想做的事。请注意如何将一对括号添加到正则表达式模式以指示模式的部分(又名组)具有感兴趣的字符。这些是捕获括号,而不是documentation 中的非捕获括号(>:...)——换句话说,常规括号是捕获的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多