You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:05:20