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

Dea*_*ton 3 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
Run Code Online (Sandbox Code Playgroud)

Dee*_*ace 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))
Run Code Online (Sandbox Code Playgroud)

该程序的输出将是 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))
Run Code Online (Sandbox Code Playgroud)

和以前一样,输出是https://www.url-example.com is not a dictionary.