【问题标题】:Parse deeply nested single line data解析深度嵌套的单行数据
【发布时间】:2023-01-07 20:49:10
【问题描述】:

我有单行输入数据为:

Row(contact=Row(officeAdd=None, homeAdd=(street='62 Crown Street', city='London', country='UK'), phone=Row(mobile=Row(primary='XXX-XXX-1234', alternate='XXX-XXX-1235'))))

我想在保留的同时将其解析为csv等级制度字段名称,如下所示:

contact/officeAdd, contact/homeAdd/street, contact/homeAdd/city, contact/homeAdd/country, contact/phone/mobile/primary, contact/phone/mobile/alternate
None, 62 Crown Street, London, UK, XXX-XXX-1234, XXX-XXX-1235

到目前为止,我无法使用正则表达式正确地获得层次结构。正则表达式是否可行,还是我需要不同的方法?

【问题讨论】:

  • Row 类型是什么,它的 __str__ 实现是什么?
  • 为什么它没有始终如一地使用(请参阅 homeAdd 条目)?

标签: python regex csv parsing


【解决方案1】:

我并没有一路走到你需要的地方(csv),但我写了一些代码,将你的数据(由字符串表示)的层次结构提取到字典中。 我无法编写一个像样的正则表达式来分隔“,”周围的文本外部括号(这可能是可能的,但我还不够好)所以我为此编写了一个辅助函数。

line = "Row(contact=Row(officeAdd=None, homeAdd=(street='62 Crown Street', city='London', country='UK'), phone=Row(mobile=Row(primary='XXX-XXX-1234', alternate='XXX-XXX-1235'))))"

import re

def text_to_dict(text):
    text = text.replace("=(","=Row(")
    if not text.startswith('Row'):
        return text.strip("'") if text else None
    inside = re.findall('Row((.*))', text)[0]
    entries = upper_level_split(inside,',')
    result = []
    for entry in entries:
        key, value = entry.split('=',1)
        result.append({key.strip():text_to_dict(value)})
    return result
    
def upper_level_split(text, sep):
    level, parsed = 0, ['']
    for letter in text:
        if letter == sep and level == 0:
            parsed.append('')
            continue
        if letter == '(':
            level += 1
        if letter == ')':
            level -= 1
        parsed[-1] += letter
    return parsed
    

text_to_dict(line)
# [{'contact': [{'officeAdd': 'None'},
#               {'homeAdd': [{'street': '62 Crown Street'},
#                            {'city': 'London'},
#                            {'country': 'UK'}]
#               },
#               {'phone': [{'mobile': [{'primary': 'XXX-XXX-1234'},
#                                      {'alternate': 'XXX-XXX-1235'}]
#                          }]
#               }]
#  }]

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2019-11-13
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多