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

标签 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

最佳答案

不要为复杂的正则表达式而烦恼,只需尝试将字符串转换为字典即可。

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

请注意,如果您使用 json.loads,如果“keys”没有用双引号引起来,转换将失败,即尝试转换字符串 "{'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 不是字典

更新:

当使用 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

关于python - 评估字符串是否为字符串化字典的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38990616/

相关文章:

python - 确定字符串是否包含任何货币符号?

Javascript 对象返回未定义的传递 key

python - 在Python中存储零的列表与字典

python - 无法访问 Python 模块

python - 从标签中获取数据(BeautifulSoup)

python - 如何避免 selenium webdriver 的套接字超时?

python - 通过系列 s1 索引系列 s2 并保留 s1 索引

python - 从字典计算欧氏距离(sklearn)

Python - 字典中函数的错误分配

python - manage.py 运行服务器错误 : [Errno 10013]