0

在我的应用程序中,我收到一个字符串'abc[0]=123'

我想将此字符串转换为项目数组。我试过eval()它对我不起作用。我知道数组名称abc,但每次的项目数都会不同。

我可以拆分字符串,获取数组索引并执行。但我想知道是否有任何直接的方法可以将此字符串转换为数组插入。我将不胜感激任何建议。

4

3 回答 3

1

这是一个根据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'}
于 2013-01-21T11:30:37.317 回答
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]

但这不是创建变量的好方法

于 2013-01-21T11:00:13.777 回答
0

您的其他应用程序做错了。它不应该在参数键中指定索引值。在 GET 中为单个键指定多个值的正确方法是简单地重复该键:

http://my_url?abc=123&abc=456

Python 服务器端应该正确地将它解析为一个类似字典的对象:你没有说你正在运行什么框架,但是例如 Django 使用一个QueryDict,然后你可以使用request.GET.getlist('abc')它来访问它,它将返回['123', '456']。其他框架将类似。

于 2013-01-21T11:14:00.027 回答