在我的应用程序中,我收到一个字符串'abc[0]=123'
我想将此字符串转换为项目数组。我试过eval()
它对我不起作用。我知道数组名称abc
,但每次的项目数都会不同。
我可以拆分字符串,获取数组索引并执行。但我想知道是否有任何直接的方法可以将此字符串转换为数组插入。我将不胜感激任何建议。
这是一个根据php规则解析url的函数(即使用方括号创建数组或嵌套结构):
import urlparse, re
def parse_qs_as_php(qs):
def sint(x):
try:
return int(x)
except ValueError:
return x
def nested(rest, base, val):
curr, rest = base, re.findall(r'\[(.*?)\]', rest)
while rest:
curr = curr.setdefault(
sint(rest.pop(0) or len(curr)),
{} if rest else val)
return base
def dtol(d):
if not hasattr(d, 'items'):
return d
if sorted(d) == range(len(d)):
return [d[x] for x in range(len(d))]
return {k:dtol(v) for k, v in d.items()}
r = {}
for key, val in urlparse.parse_qsl(qs):
id, rest = re.match(r'^(\w+)(.*)$', key).groups()
r[id] = nested(rest, r.get(id, {}), val) if rest else val
return dtol(r)
例子:
qs = 'one=1&abc[0]=123&abc[1]=345&foo[bar][baz]=555'
print parse_qs_as_php(qs)
# {'abc': ['123', '345'], 'foo': {'bar': {'baz': '555'}}, 'one': '1'}
你在找类似的东西吗
In [36]: s = "abc[0]=123"
In [37]: vars()[s[:3]] = []
In [38]: vars()[s[:3]].append(eval(s[s.find('=') + 1:]))
In [39]: abc
Out[39]: [123]
但这不是创建变量的好方法
您的其他应用程序做错了。它不应该在参数键中指定索引值。在 GET 中为单个键指定多个值的正确方法是简单地重复该键:
http://my_url?abc=123&abc=456
Python 服务器端应该正确地将它解析为一个类似字典的对象:你没有说你正在运行什么框架,但是例如 Django 使用一个QueryDict,然后你可以使用request.GET.getlist('abc')
它来访问它,它将返回['123', '456']
。其他框架将类似。