2016-03-07 56 views
1

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

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

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

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

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

for guild in guildVaults: 
    print guild 

结果:

["[email protected] - [email protected]"] = { 
["[email protected] - [email protected]"] = { 
["[email protected] - [email protected]"] = { 
["[email protected] - [email protected]"] = { 

有什么建议?

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

回答

1

您需要设置相应的标志。另外,我想提取的一切,直到一个{存在于线(假设所有的表都类似格式):

pattern = r"\[\"[email protected][a-zA-z]+ - [a-zA-z][email protected]\"\] = ({.*?^}$)" 
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 
    } 
} 
+0

不幸的是,这会产生一个空的结果。以下是如何格式化的屏幕截图:https://i.gyazo.com/8af990c1cb1711fc40db4c7a1adb74fe.png。这是隐藏第一个公会的另一个屏幕截图:https://i.gyazo.com/3353d4d40e44e547be7b45a882373b04.png – emihir0

+0

我已经编辑了OP,并在那里放了一个直接的示例数据(.lua文件) – emihir0

0

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

  1. 检测顶层线:["[email protected] - [email protected]"] = {

,并提取所有文字,直到结束}。

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

  2. 在结果前加上一些变量名,例如foo = { 并在末尾加上}。

您将获得:现在

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

,这可以在Python进行操作。

+0

的确,这是结束目标。问题是“提取所有文本直到结束”部分。 – emihir0

+0

应用一些启发式:)赞同,}独自在位置1.或者在困难的方式,计数开放和关闭花括号。 – ddbug

+0

那么我想使用模式匹配的原因是因为它应该可以在这里提取文本:[“f @ someFaction - someServer @ guildVaults”] = {...提取文本...}。但是,我无法使其工作,即使使用@ alecxe的解决方案,它仍然无法工作 - 因此我提供了一个实际的文件来进行一些测试。 – emihir0