利用python re提取文件中的块内容(多行)
应用场景:
有一个建表sql文件create_table.sql如下:
CREATE TABLE TABLE_1
( F_KEY CHAR(8) NOT NULL ENABLE, CONSTRAINT P_TRA_BASE_PRICE PRIMARY KEY (F_KEY));CREATE TABLE TABLE_2( F_SEQ_NO NUMBER(10) NOT NULL ENABLE, F_TITLE CHAR(40), F_CONTENT CHAR(1024), F_CREATE_TIMESTAMP TIMESTAMP, F_UPDATE_TIMESTAMP TIMESTAMP, CONSTRAINT P_TRA_BULLETIN_BOARD PRIMARY KEY ( F_SEQ_NO)
);
……
我想要把各个TABLE的表结构分开,然后再根据表名插入到一个dictionary里面,后续在使用时就能迅速根据表名到这个dictionary找到表结构
可以发现
(
……
……
);
这两个配对的顶格括弧形成的块,就是一张表的表结构内容
那么如何根据那两个括弧来提取这些多行的“块”状内容?
pattern=re.compile(r"^CREATE TABLE.*?^);$", re.MULTILINE|re.DOTALL)
其中使用re.MULTILINE来进行多行匹配
用re.DOTALL使.能够匹配换行符
用.*?做非贪婪匹配(否则所有的会被匹配成一条,达不到分隔的效果),代码如下:
#!/usr/bin/python import re def split_name_and_field(tb_struct): lines=tb_struct.split(" ") tb_nm_line=lines[0]#可以用命名组匹配表名 tb_nm_pattern=re.compile(r"CREATEs+TABLEs+(?P<tb_nm>T_w+)") tb_nm=tb_nm_pattern.search(tb_nm_line).group("tb_nm") tb_st=lines[2:-1] return tb_nm, tb_st fp=open("create_table.sql", "r") fc=fp.read(); table_block_pattern=re.compile(r"^CREATE TABLE.*?^);$", re.MULTILINE|re.DOTALL) result=table_block_pattern.findall(fc) #可以用前向界定匹配表名 #tb_nm_pattern2=re.compile(r"(?<=CREATE TABLE )w+") #table_name_list=tb_nm_pattern2.findall(fc) if __name__=="__main__": table_struct={} for t in result: (tb_nm, tb_st)=split_name_and_field(t) table_struct[tb_nm]=tb_st for (k,v) in table_struct.items(): print k, v
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。