python输入按逗号分开_如何用带引号的逗号拆分逗号分隔的键值对

您可以滥用Python标记器来解析键值列表:#!/usr/bin/env python

from tokenize import generate_tokens, NAME, NUMBER, OP, STRING, ENDMARKER

def parse_key_value_list(text):

key = value = None

for type, string, _,_,_ in generate_tokens(lambda it=iter([text]): next(it)):

if type == NAME and key is None:

key = string

elif type in {NAME, NUMBER, STRING}:

value = {

NAME: lambda x: x,

NUMBER: int,

STRING: lambda x: x[1:-1]

}[type](string)

elif ((type == OP and string == ',') or

(type == ENDMARKER and key is not None)):

yield key, value

key = value = None

text = '''age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"'''

print(dict(parse_key_value_list(text)))

输出

^{pr2}$

您可以使用有限状态机(FSM)来实现更严格的解析器。解析器只使用当前状态和下一个标记来分析输入:#!/usr/bin/env python

from tokenize import generate_tokens, NAME, NUMBER, OP, STRING, ENDMARKER

def parse_key_value_list(text):

def check(condition):

if not condition:

raise ValueError((state, token))

KEY, EQ, VALUE, SEP = range(4)

state = KEY

for token in generate_tokens(lambda it=iter([text]): next(it)):

type, string = token[:2]

if state == KEY:

check(type == NAME)

key = string

state = EQ

elif state == EQ:

check(type == OP and string == '=')

state = VALUE

elif state == VALUE:

check(type in {NAME, NUMBER, STRING})

value = {

NAME: lambda x: x,

NUMBER: int,

STRING: lambda x: x[1:-1]

}[type](string)

state = SEP

elif state == SEP:

check(type == OP and string == ',' or type == ENDMARKER)

yield key, value

state = KEY

text = '''age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"'''

print(dict(parse_key_value_list(text)))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值