Python正则表达式与SQL INSERT语句匹配

Python正则表达式与SQL INSERT语句匹配,python,regex,django,Python,Regex,Django,我正在django网站上工作,我正在尝试使用从遗留数据库转储的数据为django创建YAML fixture 我正在使用正则表达式编写一个粗糙的SQL解析器(我知道,我知道..但是我找不到任何东西可以帮助我快速完成这项工作,所以我必须“自己动手”——除非有更好的建议) “滚动我自己”解决方案的一部分是解析SQL语句——它们是自动生成的,因此语句的格式不会改变 下面是两个示例INSERT语句: INSERT INTO ref_geographic_region (continent_id,name

我正在django网站上工作,我正在尝试使用从遗留数据库转储的数据为django创建YAML fixture

我正在使用正则表达式编写一个粗糙的SQL解析器(我知道,我知道..但是我找不到任何东西可以帮助我快速完成这项工作,所以我必须“自己动手”——除非有更好的建议)

“滚动我自己”解决方案的一部分是解析SQL语句——它们是自动生成的,因此语句的格式不会改变

下面是两个示例
INSERT
语句:

INSERT INTO ref_geographic_region (continent_id,name) VALUES(8,'Europe (Western)');
INSERT INTO ref_currency_group (name) VALUES('Major');
我想将SQL语句归纳为以下模式:

INSERT INTO <table_name> VALUES (one_or_more_alphanums_separated_by_comma);

如何修改(并简化)上述模式,使其只匹配我感兴趣的标记?

如果语句的格式是固定的,那么使用正则表达式没有什么意义。只需使用简单的字符串解析:

parts = statement.split(' ', 4)

print(parts[2])
print(parts[3][1:-1].split(','))
print(parts[4][7:-2].split(','))
示例输出:

ref_geographic_region
['continent_id', 'name']
['8', "'Europe (Western)'"]

停止尝试使用正则表达式解析SQL。这与使用正则表达式解析HTML一样糟糕,因为SQL是一种上下文无关的语言,正则表达式无法处理这种语言。使用适当的解析模块,如


这是一个快速的半小时广告-我建议阅读its并正确理解它的工作原理。特别是,PyParsing有一些奇怪的空白行为,在您正确删除之前值得了解。

这不是对问题的直接回答-您可能已经尝试过,但发现它不够-但将SQL加载到数据库中,然后使用<代码> DimpDATAs/Cord>将它变成固定工具?考虑编写一个解析器,而不是滥用ReGEX捕获组。我在这里回答了一个类似的问题:。如果有帮助的话,那太好了。如果没有,让我知道,我会看看我是否能为你要学的语言制定语法。我喜欢这个答案。这是最简单的方法-我不知道为什么我没有想到…+1推荐PyParsing(看起来像是一个有趣的包)-我将在未来的项目中使用它,但我觉得对于这个特定的问题来说,这太过分了。
ref_geographic_region
['continent_id', 'name']
['8', "'Europe (Western)'"]
from pyparsing import Regex, QuotedString, delimitedList

# Object names and numbers match these regular expression
object_name = Regex('[a-zA-Z_]+')
number = Regex('-?[0-9]+')
# A string is just something with quotes around it - PyParsing has a built in
string = QuotedString("'") | QuotedString('"')

# A term is a number or a string
term = number | string

# The values we want to capture are either delimited lists of expressions we know about...
column_list = (delimitedList(object_name)).setResultsName('columns')
term_list = (delimitedList(term)).setResultsName('terms')

# Or just an expression we know about by itself
table_name = object_name.setResultsName('table')

# And an SQL statement is just all of these pieces joined together with some string between them
sql_stmt = "INSERT INTO " + table_name + "(" + column_list + ") VALUES(" + term_list + ");"


if __name__ == '__main__':
    res = sql_stmt.parseString("""INSERT INTO ref_geographic_region (continent_id,name) VALUES(8,'Europe (Western)');""")
    print res.table         # ref_geographic_region
    print list(res.columns) # ['continent_id', 'name']
    print list(res.terms)   # ['8', 'Europe (Western)']