python 3 regex包含create table语句from sql for azure数据块sql

eqzww0vc  于 2023-05-01  发布在  Python
关注(0)|答案(2)|浏览(138)

我有一个Oracle SQL语句。我需要一个正则表达式,它只捕获带有主键和外键约束的create table语句。

CREATE TABLE "OWB_RUN"."TOKEN_CARD_STATUS_HISTORY"
   (    "TOKEN_CARD_WH" NUMBER NOT NULL ENABLE,
    "TOKEN_STATUS" VARCHAR2(1) NOT NULL ENABLE,
    "TOKEN_STATUS_DATE" DATE NOT NULL ENABLE,
    "LOAD_DATE" DATE,
     CONSTRAINT "TOKEN_CARD_STATUS_PK" PRIMARY KEY ("TOKEN_CARD_WH", "TOKEN_STATUS", "TOKEN_STATUS_DATE")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "OWB_RUN"  ENABLE,
     CONSTRAINT "TOKEN_CARD_STATUS_FK" FOREIGN KEY ("TOKEN_CARD_WH")
      REFERENCES "OWB_RUN"."TOKEN_CARD" ("TOKEN_CARD_WH") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255  NOLOGGING
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "CARDS_CRD_FACT_TBL"
  PARTITION BY RANGE ("LOAD_DATE")
 (PARTITION "Y2021_Q1_M03"  VALUES LESS THAN (TO_DATE(' 2021-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS NOLOGGING

下面的正则表达式我尝试:

pattern = re.compile(r'CREATE\s+TABLE\s+.+?\n\)', re.DOTALL)

create_table_statement = pattern.findall(ddl)[0]
print(create_table_statement)

收到以下产出:

CREATE TABLE "OWB_RUN"."TOKEN_CARD_STATUS_HISTORY"
   (    "TOKEN_CARD_WH" NUMBER NOT NULL ENABLE,
    "TOKEN_STATUS" VARCHAR2(1)

如果使用一个正则表达式来捕获所有的create table(),我就可以了

dgsult0t

dgsult0t1#

不幸的是,regexp不能匹配嵌套的括号,所以它们对这个问题并没有真正的用处。除非您想假设SQL的CREATE TABLE部分中的括号数。
参见例如:Can regular expressions be used to match nested patterns?
如果解决方案不需要正则表达式,那么一段简单的python代码循环字符并跟踪嵌套将是一个更可行的选择。

ghhkc1vu

ghhkc1vu2#

你将不得不作出轻微的mods需要这个工作在re。编译,但这个表达式得到你想要的,减去'ENABLE'后面的最后一个右括号。

^(CREATE\sTABLE(?s).*FOREIGN KEY\s\((?s).*ENABLE)

将+')'附加到每个模式更容易。findall(ddl)[0]比添加换行符和三个空格then)到模式,但如果你喜欢,你可以更新它。

^            From the beginning 
(            start of capture group 
             Create \s Table 
(?s).*       Any character including new line any number of times
             Foreign Key
\s\((?s).*   space, parenthesis, any character including new line any number of times
             Enable
) end of capture group

如果您想调整捕获的内容,请使用regex101

相关问题