用逗号分隔逗号分隔的键值对

时间:2016-03-12 13:26:57

标签: python parsing

有点像这个问题: How to split comma-separated key-value pairs with quoted commas

但我的问题是:

line='name=zhg,code=#123,"text=hello,boy"'

注意,“text = hello,boy”,NOT:text =“hello,boy”

我想把这条线分开来。 我想要的输出是:

"name":"zhg","code":"#123","text":"hello,boy"

如何使用正则表达式或shlex获取它?

2 个答案:

答案 0 :(得分:0)

你不能用正则表达式做到这一点,否则它不会是最有效的。使用单通道解析器解析此类字符串的代码非常简单:

line='name=zhg,code=#123,"text=hello,boy"'


def read_quote(string):
    out = ''
    for index, char in enumerate(string):
        if char == '"':
            index += 2  # skip quote and comma if any
            return index, out
        else:
            out += char


def read(string):
    print('input', string)
    out = ''
    for index, char in enumerate(string):
        if char == ',':
            index += 1  # skip comma
            return index, out
        else:
            out += char
    # end of string
    return index, out

def components(string):
    index = 0
    while index < len(line):
        if string[index] == '"':
            inc, out = read_quote(string[index+1:])
            index += inc
            yield out
        else:
            inc, out = read(string[index:])
            index += inc
            yield out

print(dict([e.split('=') for e in components(line)]))

它打印以下内容:

{'text': 'hello,boy', 'code': '#123', 'name': 'zhg'}

如果您愿意,可以使用正则表达式实现readread_quote

答案 1 :(得分:0)

您可以csv.reader使用适当的&#34;类文件&#34;字符串。

>>> import csv
>>> import StringIO
>>> line='name=zhg,code=#123,"text=hello,boy"'
>>> string_file = StringIO.StringIO(line)
>>> for row in csv.reader(string_file):
...  print row
...
['name=zhg', 'code=#123', 'text=hello,boy']