当列表是函数的结果时,如何从列表中创建单个列表?

时间:2017-11-30 22:38:21

标签: python json list parsing

我有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]

2 个答案:

答案 0 :(得分:0)

您可以略微更改正则表达式,以便包括一个积极的前瞻和列表:

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()))

答案 1 :(得分:0)

使用稍长的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中的非捕获括号(>:...) - 换句话说,常规括号是捕获的类型。