Python re库匹配含$的CREATE TABLE块问题排查求助
原正则表达式的问题分析及修正方案
原正则的核心问题
你写的正则(?m)^CREATE TABLE.*\$.*[\s\S]^\)$匹配失败的原因主要有三点:
- 缺少量词,无法匹配多行内容:
[\s\S]只能匹配单个任意字符,而CREATE TABLE块中间有多行字段定义,这部分完全没被覆盖,导致正则找不到完整的目标块。 - 匹配逻辑断层:在匹配完含
$的CREATE TABLE行后,仅尝试匹配一个字符就直接找结束括号行,逻辑上跳过了中间所有字段行,自然无法匹配到符合格式的完整表块。 - 未处理贪婪匹配风险:即使补上量词,如果用贪婪模式(如
*),可能会错误匹配到多个表块的内容,把正常表的代码也删掉。
修正后的正则表达式
针对你的DDL格式规范,修正后的正则可以精准匹配并删除目标表块:
import re pattern = re.compile(r'(?m)^CREATE TABLE.*\$.*\n([\s\S]*?)\n^\)$')
正则各部分说明
(?m):开启多行模式,让^匹配每行开头、$匹配每行结尾。^CREATE TABLE.*\$.*:精准定位开头行——以CREATE TABLE起始,且行内包含$(即表名含$)。\n:匹配开头行后的换行符,衔接后续内容。([\s\S]*?):非贪婪匹配中间所有内容([\s\S]覆盖所有字符包括换行,*?避免过度匹配到其他表块)。\n^\)$:匹配单独一行仅包含)的结束行,确保只匹配完整的表块。
实际使用示例
ddl_content = """ CREATE TABLE "SCH"."SOME$TABLE" ( "NAME" VARCHAR2(100 CHAR), "DATA1" BLOB, "TIMESTAMP1" DATE ) CREATE TABLE "SCH"."NORMAL_TABLE" ( "ID" NUMBER, "VALUE" VARCHAR2(50) ) """ cleaned_ddl = pattern.sub('', ddl_content) print(cleaned_ddl)
执行后会删除含$的表块,保留正常表的DDL代码。
内容的提问来源于stack exchange,提问作者Piotr L
相关产品推荐
相关产品推荐

