【问题标题】:Python: parsing help needed!Python:需要解析帮助!
【发布时间】:2011-08-15 07:16:03
【问题描述】:

我正在尝试检索 .lua 文件中的某些字段。最初我以为我可以用逗号分开,但第二组大括号破坏了这一点。一个例子:

返回{
    { 6163, 0, "tv", false, {1302}, "ESPN Deportes", "ESPN Deportes es el", nil,"tv","936",nil,"4x3", mediaRestrictions={"m2g" } },
    { 57075, 0, "tv", false, {1302}, "Video Rola", "Video \"Música Para Tus Ojos\", uedes ver.", nil,"tv","948",nil,"4x3 ", mediaRestrictions={"m2g" } },
    { 717242, 0, "tv", false, {1302,1301,1288}, "Hits", "asdlfj", nil,"cliplinear","6310",nil,"4x3", mediaRestrictions={"m2g" } },
    { 122719, 0, "tv", false, {1302,1301,1288}, "Bombone", "asdf", nil,"tv","74",nil,"4x3", mediaRestrictions={"m2g" } },
}

所以我会从第一行中寻找以下内容: “ESPN Deportes”(第 6 场),tv(第 9 场),936(第 10 场)

上帝帮助我……或者更有可能是一个 stackoverflow 忍者。 (Python)


已更新解决方案

S.Mark 慷慨提供的解决方案:

res = conn.getresponse()
data = res.read()

# Hackisly transform the lua into json
data = re.sub('\w+=', '', data)
data = data.replace("return","")
data = data.replace("{","[").replace("}","]")
data = data.replace("nil","null")
data = data.replace(",]","]")
data = json.loads(data.strip())

【问题讨论】:

标签: python regex parsing


【解决方案1】:

你可以试试这个技巧:

  1. 从字符串中删除'return'
  2. {} 替换为[]
  3. 在字符串上运行eval(或ast.literal_eval,更安全)获取列表列表
  4. 得到你想要的元素

【讨论】:

  • literal_eval 是天才。在 python 2.7+ 中,您甚至可以放弃第 2 步,因为添加了集合文字。然而,无论如何,这不起作用,因为除其他外,mediaRestrictions={"m2g" } 不是有效的集合或列表项。
【解决方案2】:

可能会转成json。

import json

text = r"""return { 
{ 6163, 0, "tv", false, {1302}, "ESPN Deportes", "ESPN Deportes es el", nil,"tv","936",nil,"4x3", mediaRestrictions={"m2g" } },
{ 57075, 0, "tv", false, {1302}, "Video Rola", "Video \"Música Para Tus Ojos\", uedes ver.", nil,"tv","948",nil,"4x3", mediaRestrictions={"m2g" } },
{ 717242, 0, "tv", false, {1302,1301,1288}, "Hits", "asdlfj", nil,"cliplinear","6310",nil,"4x3", mediaRestrictions={"m2g" } },
{ 122719, 0, "tv", false, {1302,1301,1288}, "Bombone", "asdf", nil,"tv","74",nil,"4x3", mediaRestrictions={"m2g" } },
}"""

obj = json.loads(text.replace("return","").replace("mediaRestrictions=","").replace("{","[").replace("}","]").replace("nil","null").replace("\n","").replace(",]","]").strip())

print obj

# [[6163, 0, u'tv', False, [1302], u'ESPN Deportes', u'ESPN Deportes es el', None, u'tv', u'936', None, u'4x3', [u'm2g']], [57075, 0, u'tv', False, [1302], u'Video Rola', u'Video "M\xfasica Para Tus Ojos", uedes ver.', None, u'tv', u'948', None, u'4x3', [u'm2g']], [717242, 0, u'tv', False, [1302, 1301, 1288], u'Hits', u'asdlfj', None, u'cliplinear', u'6310', None, u'4x3', [u'm2g']], [122719, 0, u'tv', False, [1302, 1301, 1288], u'Bombone', u'asdf', None, u'tv', u'74', None, u'4x3', [u'm2g']]]

for x in obj:
  print x[5], x[8], x[9]

#ESPN Deportes tv 936
#Video Rola tv 948
#Hits cliplinear 6310
#Bombone tv 74

【讨论】:

  • 我可以说你是个能把事情做好的人。谢谢大佬,好东西!
【解决方案3】:

我在 lua 方面没有经验,但我猜你将其作为字符串/文件接收。

不是最好的解决方案:

import json
myvalue = "{ 1,2,3, { 4,5,6}, {7} }"
myvalue = myvalue.replace("{", "[").replace("}", "]")
mylist = json.loads(myvalue)

然后把它当作一个列表来处理?

或者如果是文件使用json.load而不是json.loads

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多