Python - 正则表达式,看后面

时间:2014-05-21 15:39:08

标签: python regex

我想在“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).+?\(

如何匹配第一个括号?

2 个答案:

答案 0 :(得分:2)

你在这里不需要 Lookbehind

>>> re.sub(r'(?i)(CREATE *TABLE[^(]*\()', "\\1\n", data)

注意:内联(?i)修饰符放在此处以进行不区分大小写的匹配。

Working Demo

答案 1 :(得分:1)

您的首要问题是(?=...)前瞻(?<=...) lookbehind 。因为我们不仅需要匹配CREATE TABLE,还需要匹配表名。这是一个'变量'长度,并且不能放在一个lookbehinds(只有lookaheads可以是可变长度)。我们仍然可以将CREATE TABLE放在后面,但由于我们仍然需要对表名使用捕获/引用,这种方法会失败。

因此,我只是匹配CREATE TABLE后跟1 +非(个字符,最后是我们的(。在我们的替换过程中,我们可以使用\0引用所有匹配的数据,并附加\n

CREATE\s+TABLE\s+[^(]+\(
\0\n

Demo


<强>输出:

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个以上的空白字符。