首页 > 解决方案 > 如何在递归中使用正则表达式

问题描述

input = '''name Jhon age 30 name John bp 130 90 name Rick age 80 name Rick bp 110 70'''

我有一个像上面那样的字符串。

我需要将其作为字典列表

[ 
    {
        "name": "John",
        "age" : 30,
        "bp_sys" : 130,
       "bp_dia" : 90
   },
   {
       "name": "Rick",
       "age" : 80,
       "bp_sys" : 110,
       "bp_dia" : 70
   }
]

我在下面尝试过 - 按行拆分输入并在每行上应用正则表达式

for line in input.split("\n"):
    print re.findall(r'name (.*?) age (.*?)', line)

它打印[('John', '')]第一行的内容

还有什么简单的方法吗?

标签: python

解决方案


使用groupby来自 itertools 和正则表达式。

演示:

from itertools import groupby
import re

inputVal = '''name John age 30
name John bp 130 90
name Rick age 80
name Rick bp 110 70'''

inputVal = inputVal.splitlines()
res = []
for key, group in groupby(inputVal, lambda x: re.findall(r'(?<=name\s).*?(?=\s)', x)[0]):
    d = {"name": key}
    for i in group:
        if "age" in i:
            val = i.split()
            d["age"] = int(val[-1])
        if "bp" in i:
            val = i.split()
            d["bp_sys"] = int(val[-2])
            d["bp_dia"] = int(val[-1])
    res.append(d)
print(res)

输出:

[{'age': 30, 'bp_sys': 130, 'name': 'John', 'bp_dia': 90}, {'age': 80, 'bp_sys': 110, 'name': 'Rick', 'bp_dia': 70}]
  • 我使用名称作为键。例如:'John','Rick'

推荐阅读