评估字符串是否为字典字典的最佳方法是什么?

时间:2016-08-17 07:31:23

标签: python dictionary

我可以使用正则表达式,但我想知道是否有更好的方法。

例如,值可能返回为:

1。)'{"username": "joe.soap", "password": "pass@word123"}'

2。)'https://www.url-example.com'

在1.)的情况下,我想将内容转换为实际字典。我很高兴我知道如何进行转换。我坚持如何识别1.)而不回复使用正则表达式。

编辑:因为有人问我,这就是我计划进行转换的方式:

import ast

if string_in_question == '{"username": "joe.soap", "password": "pass@word123"}':
    return ast.literal_eval(str‌​ing_in_question)
else:
    return valid_command_return‌​s

1 个答案:

答案 0 :(得分:8)

不要打扰复杂的正则表达式,只需尝试将字符串转换为字典。

我假设您正在使用json.loads来执行此操作。如果字符串不表示字典json.loads将引发异常。

请注意,如果您使用json.loads,如果“密钥”未被双引号括起,则转换将失败,即尝试将字符串"{'username': 'joe.soap', 'password': 'pass@word123'}"转换为字典将引发异常好。

import json

a = '{"username": "joe.soap", "password": "pass@word123"}'
b = 'https://www.url-example.com'

try:
    json.loads(a)
except ValueError:
    print("{} is not a dictionary".format(a))

try:
    json.loads(b)
except ValueError:
    print("{} is not a dictionary".format(b))

该程序的输出将是 https://www.url-example.com is not a dictionary

<强>更新

使用ast.literal_eval时,概念是相同的,但您必须抓住SyntaxError而不是ValueError。请注意,使用literal_eval单引号和双引号都可以接受。

import ast

a = '{"username": "joe.soap", "password": "pass@word123"}'
b = "{'username': 'joe.soap', 'password': 'pass@word123'}"
c = 'https://www.url-example.com'

try:
    ast.literal_eval(a)
except SyntaxError:
    print("{} is not a dictionary".format(a))

try:
    ast.literal_eval(b)
except SyntaxError:
    print("{} is not a dictionary".format(b))

try:
    ast.literal_eval(c)
except SyntaxError:
    print("{} is not a dictionary".format(c))

与之前相同,输出为https://www.url-example.com is not a dictionary