如何使用Python解析.lua文件并拉出require语句?

2024-10-01 15:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我不太擅长解析文件,但有一些我想完成的事情。以下是.lua脚本的一个片段,其中包含一些require语句。我想使用Python解析这个.lua文件并拉出'require'语句。在

例如,以下是require语句:

require "common.acme_1"
require "common.acme_2"
require "acme_3"
require "common.core.acme_4"

从上面的例子中,我想把目录从所需的文件中分离出来。在“require”示例中通用.acme_1“'目录将是公共的,所需的文件将是acme_1。然后我只需将.lua扩展添加到acme_1。我需要这些信息,这样我就可以验证文件系统中是否存在该文件(我知道如何做),然后针对luac(编译器)来确保它是有效的lua文件(我也知道如何做)。在

我只需要帮助使用Python将这些require语句从文件名中分离出来。在


Tags: 文件core目录脚本信息示例编译器require
3条回答

给你!在

import sys
import os.path
if len(sys.argv) != 2:
    print "Usage:", sys.argv[0], "<inputfile.lua>"
    exit()
f = open(sys.argv[1], "r")
lines = f.readlines()
f.close()
for line in lines:
    if line.startswith("require "):
        path = line.replace('require "', '').replace('"', '').replace("\n", '').replace(".", "/") + ".lua"
        fName = os.path.basename(path)
        path = path.replace(fName, "")
        print "File: " + fName
        print "Directory: " + path
        #do what you want to each file & path here

您可以使用内置的字符串方法来实现这一点,但是由于解析有点复杂(路径可以是多部分的),最简单的解决方案可能是使用regex。如果使用的是regex,则可以使用组进行解析和拆分:

import re


data = \
'''
require "common.acme_1"
require "common.acme_2"
require "acme_3"
require "common.core.acme_4"
'''


finds = re.findall(r'require\s+"(([^."]+\.)*)?([^."]+)"', data, re.MULTILINE)

print [dict(path=x[0].rstrip('.'),file=x[2]) for x in finds]

第一组是路径(包括尾部),第二组是匹配重复路径部分所需的内部组(丢弃),第三组是文件名。如果没有路径,则得到path=''。在

输出:

^{pr2}$

这里有一个疯狂的一行,不确定这是否正是你想要的,最肯定不是最理想的一个。。。在

In [270]: import re

In [271]: [[s[::-1] for s in rec[::-1].split(".", 1)][::-1] for rec in re.findall(r"require \"([^\"]*)", text)]
Out[271]: 
[['common', 'acme_1'],
 ['common', 'acme_2'],
 ['acme_3'],
 ['common.core', 'acme_4']]

相关问题 更多 >

    热门问题