有点像这个问题: 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获取它?
答案 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'}
如果您愿意,可以使用正则表达式实现read
和read_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']