python中使用regexp解析mySQL代码

2024-09-30 08:37:35 发布

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

我试图解析一堆SQL脚本,找出它们读写的所有表。在

到目前为止,我加载了该文件,将其拆分为多个查询,并成功地解析了一些内容。在

createproc = re.compile(r"""\s*create procedure (?P<procedurename>[a-zA-Z_0-9.]+)\s*""")
droptable = re.compile(r"""\s*drop table (if exists)* (?P<tablename>[a-zA-Z_0-9.]+)\s*""")
createtable = re.compile(r"""\s*create table (if not exists)* (?P<tablename>[a-zA-Z_0-9.]+)\s*""")
createindex = re.compile(r"""\s*create index [a-zA-Z_0-9. ]*on (?P<tablename>[a-zA-Z_0-9.]+)\s*""")
altertable = re.compile(r"""\s*alter table (?P<tablename>[a-zA-Z_0-9.]+)\s*""")
inserttable = re.compile(r"""\s*insert into (?P<tablename>[a-zA-Z_0-9.]+)\s*""")
updatetable = re.compile(r"""\s*update (?P<tablename>.*?)\s* set""")
deletetable = re.compile(r"""delete.*from[\r\n\s]*(?P<tablename>.*?)[\r\n\s]+""")

虽然我确信所有这些regexp都不是最好的,尤其是最后一个让我头疼。 我有一个测试字符串:

^{pr2}$

试着分析一下:

^{3}$

而我却空无一人。我试了几件事,但到目前为止没有任何帮助。在

不幸的是,SQL脚本在换行符、空白和缩进方面非常不一致,所以我必须考虑所有可能发生的情况


Tags: 文件re脚本内容sqlifcreateexists
3条回答

不要将flags传递给search,您需要在compile调用中提供它们。regex对象的search方法需要一个起始位置作为第二个参数,而不是标志。在

import re
deletetable = re.compile(r'delete(?:\s+\w+)*?\s+from\s+(?P<tablename>[\w.]+)', 
           re.MULTILINE | re.DOTALL)
teststring = 'delete from my_db.my_table \r\n where\r\n(my_column >= 5/2 or my_column is null);'
match =deletetable.search(teststring)
if match:
    print(match.group("tablename"))

这项工作:

deletetable2 = re.compile(r"""delete\s*from\s*(?P<tablename>\S*?)\s+.*""")
teststring = 'delete from my_db.my_table \r\n where\r\n(my_column >= 5/2 or my_column is null);'
print deletetable2.search(teststring).groups() # ('my_db.my_table',)
print deletetable2.search(teststring).group("tablename") # my_db.my_table

我认为你必须简化你的表达式,以一个点结束,而不是指定标志

我认为问题在于re.MULTILINE和{}的用法。我试过你的测试没有他们,它成功了。在

相关问题 更多 >

    热门问题