我想在“CREATE TABLE tablename(”之后添加换行符,所以我的想法是匹配(
的第一次出现并将其替换为(\n
:
来源文字:
abcd
something
CREATE TABLE schema.test1(attribute1 DECIMAL(28, 7) NULL ,
ATTRIBUTE2 DECIMAL(28, 7) KEY NOT NULL ,
ATTRIBUTE3 DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
efgh
something else
CREATE TABLE schema.test2(columna DECIMAL(28, 7) NULL ,
columnb DECIMAL(28, 7) KEY NOT NULL ,
columnc DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
期望的结果:
abcd
something
CREATE TABLE schema.test1(
attribute1 DECIMAL(28, 7) NULL ,
ATTRIBUTE2 DECIMAL(28, 7) KEY NOT NULL ,
ATTRIBUTE3 DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
efgh
something else
CREATE TABLE schema.test2(
columna DECIMAL(28, 7) NULL ,
columnb DECIMAL(28, 7) KEY NOT NULL ,
columnc DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
我设法在包括括号之前匹配文字:
(?=CREATE\ TABLE).+?\(
如何匹配仅第一个括号?
答案 0 :(得分:2)
你在这里不需要 Lookbehind 。
>>> re.sub(r'(?i)(CREATE *TABLE[^(]*\()', "\\1\n", data)
注意:内联(?i)
修饰符放在此处以进行不区分大小写的匹配。
答案 1 :(得分:1)
您的首要问题是(?=...)
是前瞻,(?<=...)
是 lookbehind 。因为我们不仅需要匹配CREATE TABLE
,还需要匹配表名。这是一个'变量'长度,并且不能放在一个lookbehinds(只有lookaheads可以是可变长度)。我们仍然可以将CREATE TABLE
放在后面,但由于我们仍然需要对表名使用捕获/引用,这种方法会失败。
因此,我只是匹配CREATE TABLE
后跟1 +非(
个字符,最后是我们的(
。在我们的替换过程中,我们可以使用\0
引用所有匹配的数据,并附加\n
。
CREATE\s+TABLE\s+[^(]+\(
\0\n
<强>输出:强>
abcd
something
CREATE TABLE schema.test1(
attribute1 DECIMAL(28, 7) NULL ,
ATTRIBUTE2 DECIMAL(28, 7) KEY NOT NULL ,
ATTRIBUTE3 DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
efgh
something else
CREATE TABLE schema.test2(
columna DECIMAL(28, 7) NULL ,
columnb DECIMAL(28, 7) KEY NOT NULL ,
columnc DECIMAL(28, 7) NOT NULL ,
SET("db_alias_name" = 'TEST')
;
注意:我将替换为
\s+
,其中包含1个以上的空白字符。