Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用模式匹配,从.lua文件中提取一个表_Python_Regex - Fatal编程技术网

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

在python中使用模式匹配,从.lua文件中提取一个表,python,regex,Python,Regex,我有一个.lua文件,其中存储了以下格式的表: ["f@someFaction - someServer@guildVaults"] = { ["someStr1"] = { ["someStr2"] = 7, ["someStr3"] = 2 } ["someStr4"] = { ["someStr5"] = 7, ["someStr6"] = 2 } } 基本上可以有任意数量的嵌套表。我知道要提

我有一个.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文件示例:
您需要设置适当的标志。此外,我将提取所有内容,直到一行中出现一个
{
(假设所有表的格式都类似):

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

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

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

  • 检测顶级行:
    [”f@someFaction - someServer@guildVaults“]={
  • 并提取所有文本,直到结尾}

  • 在本文中,删除所有方括号,将所有“}”替换为“}”,并将=替换为:

  • 为结果预先添加一些变量名,例如
    foo={
    并在末尾添加}

  • 您将获得:

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

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

    不幸的是,这会产生一个空结果。以下是有关如何格式化的屏幕截图:。这里是另一个隐藏了第一个公会的截图:我已经编辑了OP,并在那里放置了一个直接的样本数据(.lua文件)。事实上,这是最终目标。问题是“提取所有文本直到结尾}”部分。应用一些启发式:)例如,}单独在位置1中。我之所以要使用模式匹配,是因为这里应该可以提取文本:[”f@someFaction - someServer@guildVaults“]={…要提取的文本…}。但是,我无法使它工作,即使使用@alecxe的解决方案,它仍然无法工作-因此我提供了一个实际的文件来进行一些测试。也许这可以通过一些高级的regexp-fu来完成。也许我会将这两种方法结合起来:简单地循环文件+简单的模式匹配,搜索每个块/变量的第一行和最后一行。我已经意识到错误在于在打开文件时使用了“rb”而不是“r”。它现在按照alecxe的建议工作(有一些小的调整)。
    foo = {
        "someStr1" : {
            "someStr2" : 7,
            "someStr3" : 2
        },
        "someStr4" : {
            "someStr5" : 7,
            "someStr6" : 2
        }
    }