我有一个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(),我就可以了
2条答案
按热度按时间dgsult0t1#
不幸的是,regexp不能匹配嵌套的括号,所以它们对这个问题并没有真正的用处。除非您想假设SQL的CREATE TABLE部分中的括号数。
参见例如:Can regular expressions be used to match nested patterns?
如果解决方案不需要正则表达式,那么一段简单的python代码循环字符并跟踪嵌套将是一个更可行的选择。
ghhkc1vu2#
你将不得不作出轻微的mods需要这个工作在re。编译,但这个表达式得到你想要的,减去'ENABLE'后面的最后一个右括号。
将+')'附加到每个模式更容易。findall(ddl)[0]比添加换行符和三个空格then)到模式,但如果你喜欢,你可以更新它。
如果您想调整捕获的内容,请使用regex101。