我可以使用正则表达式,但我想知道是否有更好的方法。
例如,值可能返回为:
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(string_in_question)
else:
return valid_command_returns
答案 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
。