【问题标题】:splitting a braces grouped string in python在python中拆分大括号分组字符串
【发布时间】:2013-05-03 10:05:31
【问题描述】:

感谢使用单行成语帮助有效地执行以下操作。

我有一个由大括号分隔的组的字符串,如下所示:

{1:xxxx}{2:xxxx}{3:{10:xxxx}}{4:xxxx\r\n:xxxx}....  

如何将其转换为字典格式?

dict={1:'xxx',2:'xxxx',3:'{10:xxxx}'},4:'xxxx\r\n:xxxx'}  

【问题讨论】:

  • xxxxs 是否包含大括号?
  • 好问题。他们确实这样做了 - 并且同样编辑了问题
  • “值”是否被随机引用/未引用?
  • xxxx 中是否有 }{ 对?
  • xxxx 中是否有 : 字符? xxxx 的内容对于如何处理这个问题很重要。如果保证这些位不具有某些功能,则可以使用非常简单的方法。

标签: python string split


【解决方案1】:
r = """(?x)
{
    (\w+)
    :
    (
        (?:
            [^{}]
            |
            {.+?}
        )+
    )
}
"""

z = "{1:xxxx}{2:xxxx}{3:{10:xxxx}}{4:'xxxx'}"
print dict(re.findall(r, z))

# {'1': 'xxxx', '3': '{10:xxxx}', '2': 'xxxx', '4': "'xxxx'"}

如果您愿意,可以随意转换为单行 - 只需从正则表达式中删除 (?x) 和所有空格。

上面只解析了一层嵌套,为了处理任意深度考虑支持递归模式的更高级的regex模块:

import regex

r = """(?x)
{
    (\w+)
    :
    (
        (?:
            [^{}]
            |
            (?R)
        )+
    )
}
"""

z = "{1:abc}{2:{3:{4:foo}}}{5:bar}"
print dict(regex.findall(r, z))

# {'1': 'abc', '2': '{3:{4:foo}}', '5': 'bar'}

【讨论】:

  • 我喜欢这个,但是如果输入字符串中有嵌套的{}s,它会失败,例如{3:{10:{}}} - 你会得到[('3', '{10:{}')]
【解决方案2】:

我会这样做:

raw = """{1:xxxx}{2:xxxx}{3:{10:xxxx}}{4:'xxxx\r\n:xxxx'}"""

def parse(raw):
    # split into chunks by '}{' and remove the outer '{}'
    parts = raw[1:-1].split('}{')
    for part in parts:
        # split by the first ':'
        num, data = part.split(':', 1)
        # yield each entry found
        yield int(num), data

# make a dict from it
print dict(parse(raw))

它将'{10:xxxx}' 保留为字符串,就像在您的示例中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2019-01-23
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2018-04-14
    • 2021-08-04
    相关资源
    最近更新 更多