在python中使用模式匹配,从.lua文件中提取表

时间:2016-03-07 17:11:27

标签: python regex

我有一个.lua文件,其中存储了以这种格式存储的表:

["f@someFaction - someServer@guildVaults"] = {
    ["someStr1"] = {
        ["someStr2"] = 7,
        ["someStr3"] = 2
    }
    ["someStr4"] = {
        ["someStr5"] = 7,
        ["someStr6"] = 2
    }
}

基本上可以有任意数量的嵌套表。我知道我要提取的初始表的名称,但是,我无法提取后续表。

with open("somePath", "rb") as file:
    f = file.read()

pattern = r"\[\"f@[a-zA-z]+ - [a-zA-z]+@guildVaults\"\] = \{[ \t\n]*"
guildVaults = re.findall(pattern, f)

for guild in guildVaults:
    print guild

结果:

["f@Alliance - Thunderhorn@guildVaults"] = {
["f@Alliance - Proudmoore@guildVaults"] = {
["f@Alliance - Kazzak@guildVaults"] = {
["f@Horde - Draenor@guildVaults"] = {

有什么建议吗?

编辑: 这里的.lua文件示例: http://www.pastefile.com/Tx2LVD

2 个答案:

答案 0 :(得分:1)

您需要设置相应的标记。此外,我会提取所有内容,直到一行{出现(假设所有表的格式相似):

pattern = r"\[\"f@[a-zA-z]+ - [a-zA-z]+@guildVaults\"\] = ({.*?^}$)"
guildVaults = re.findall(pattern, data, re.MULTILINE | re.DOTALL)

for guild in guildVaults:
    print(guild)

对于提供的输入数据,它会打印:

{
    ["someStr1"] = {
        ["someStr2"] = 7,
        ["someStr3"] = 2
    }
    ["someStr4"] = {
        ["someStr5"] = 7,
        ["someStr6"] = 2
    }
}

答案 1 :(得分:0)

也许您想将lua转换为python,然后执行结果并获取本机python对象。

  1. 检测顶级行:["f@someFaction - someServer@guildVaults"] = {
  2. 并提取所有文字直到结尾}。

    1. 在本文中,删除所有方括号,将所有“}”替换为“}”,然后将=替换为:。

    2. 为结果添加一些变量名称,例如foo = { 最后添加}。

    3. 你会得到:

      foo = {
          "someStr1" : {
              "someStr2" : 7,
              "someStr3" : 2
          },
          "someStr4" : {
              "someStr5" : 7,
              "someStr6" : 2
          }
      }
      

      现在,这可以在Python中进行操作。

相关问题