先前我需要处理的问题是生成一个类似这个连接的表格,由于这个表格的各项数据是直接从数据库提取数据计算出来然后在提交给Google Visualization API,最后返还结果。这样做最大的弊端是如果数据比较多的情况下会引发一个datastore timeout: operation took too long的异常,于是我重写了这个程序把计算的结果变成一个数据库,这样做就避免了引发这个异常的问题。

使用正则表达式匹配中英文字符

这个问题也困扰了我很长时间。我需要从类似:


MiDKPData = {};
MiDKPData["dkp"] = {};


MiDKPData["dkp"][1] = {};
MiDKPData["dkp"][1]["name"] = "开心圈圈DKP";
MiDKPData["dkp"][1]["members"] = {};
MiDKPData["dkp"][1]["members"]["Donesee"] = 5;
MiDKPData["dkp"][1]["members"]["Latrogue"] = 0;
MiDKPData["dkp"][1]["members"]["Longwalker"] = 15;
MiDKPData["dkp"][1]["members"]["Lovelace"] = 56;
MiDKPData["dkp"][1]["members"]["Lucid"] = 232;
MiDKPData["dkp"][1]["members"]["Mitnick"] = 0;
MiDKPData["dkp"][1]["members"]["Neverlose"] = 33;
MiDKPData["dkp"][1]["members"]["Ooxxoo"] = 10;
MiDKPData["dkp"][1]["members"]["Shadowghost"] = 3;
MiDKPData["dkp"][1]["members"]["Steafinie"] = 14;
MiDKPData["dkp"][1]["members"]["一脸猥琐"] = 5;
MiDKPData["dkp"][1]["members"]["三聚氰胺"] = 31;
MiDKPData["dkp"][1]["members"]["人生真谛"] = 20;
MiDKPData["dkp"][1]["members"]["伟大的乌瑟尔"] = 5;
MiDKPData["dkp"][1]["members"]["光之留香"] = 73;

这样的数据中提取字符,这应该是Lua中数据类型。开始我考虑用处理字符串的方法提取,但经过测试效率很低而且容易出错。然后我尝试使用正则表达式匹配这些数据,使用正则表达式匹配的话需要对里面可能出现的中文进行匹配,该文件正常情况下应该是采用UTF-8编码。

def retext(data):
    data = data.split('\n')
    dict0 = {}
    for li in data:
        m = re.match(r"(\[\")(\w+|[\x80-\xff]+|[\u3400-\u9FFF]+)(\"\]\s\=\s)(\d+)(\;)",li)
        try:
            dict0[m.group(3)]=m.group(5)
        except AttributeError:
            pass
    return dict0

retext()中的[\x80-\xff]+可以匹配任意长度的UTF-8编码的中文,而[\u3400-\u9FFF]+可以匹配任意长度的unicode编码中文。我在函数中加入了对unicode编码进行匹配的原因是我需要处理的这个字符串是通过request.POST.get()发送到服务器的。而这个request.POST.get()正是使用unicode编码。如果在数据库中查询这些数据则还需要使用decode('utf-8')将字符转化成UTF-8编码。

数据对象key_name属性

设置数据库字段的key_name属性:如果某些字符串和数据库的对象是一一对应的,而这些字符串刚好又符合设置成key_name的条件,那么把这些字符串设置成key_name属性会方便许多