利用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('\n')
    tb_nm_line=lines[0]#可以用命名组匹配表名
    tb_nm_pattern=re.compile(r'CREATE\s+TABLE\s+(?P<tb_nm>T_\w+\b)')
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值