Python正则表达式提取PL/SQL中含CONSTRAINT和CHECK的语句
用Python正则提取PL/SQL建表语句里的CONSTRAINT CHECK约束
需求
从PL/SQL的CREATE TABLE代码里,把所有带CONSTRAINT和CHECK的约束语句提出来,最终得到这种格式的列表:
['CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N1" CHECK (cif IS NOT NULL)', 'CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N2" CHECK (offer_day IS NOT NULL)', 'CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N3" CHECK (f_accepted IS NOT NULL)', 'CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_C1" CHECK (f_accepted IN (0,1,2))']
实现代码
直接用下面的Python代码就能搞定:
import re # 替换成你的实际建表语句 create_table_sql = """ CREATE TABLE FS_WITHOUT_RESCHED_OFFERS ( cif VARCHAR2(20), offer_day DATE, f_accepted NUMBER(1), CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N1" CHECK (cif IS NOT NULL), CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N2" CHECK (offer_day IS NOT NULL), CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_N3" CHECK (f_accepted IS NOT NULL), CONSTRAINT "FS_WITHOUT_RESCHED_OFFERS_C1" CHECK (f_accepted IN (0,1,2)) ) """ # 正则规则,匹配目标约束 pattern = r'CONSTRAINT\s+"[^"]+"\s+CHECK\s+\([^)]+\)' # 提取所有匹配项,忽略大小写 matches = re.findall(pattern, create_table_sql, re.IGNORECASE) print(matches)
正则规则解释
CONSTRAINT\s+:匹配CONSTRAINT关键字和后面的任意空格"[^"]+":精准匹配双引号括起来的约束名称,不会断在中间\s+CHECK\s+:匹配CHECK关键字和前后的空格\([^)]+\):匹配CHECK后面括号里的所有内容,适合没有嵌套括号的普通场景
特殊情况处理
如果你的CHECK约束里有嵌套括号(比如CHECK (col > (SELECT MAX(val) FROM tab))),上面的基础正则会失效,换成下面这个支持递归匹配的规则就行:
# 支持嵌套括号的正则(Python 3.10及以上可用) pattern_recursive = r'CONSTRAINT\s+"[^"]+"\s+CHECK\s+\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)' matches_recursive = re.findall(pattern_recursive, create_table_sql, re.IGNORECASE)
内容的提问来源于stack exchange,提问作者KRStam
相关产品推荐
相关产品推荐

