Python-Regex,回头看

Python-Regex,回头看,python,regex,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"

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

我如何才能只匹配第一个括号?

您的第一个问题是
(?=…)
是一个前瞻
(?这里不需要后视

>>> re.sub(r'(?i)(CREATE *TABLE[^(]*\()', "\\1\n", data)
注意:此处放置内联
(?i)
修饰符,用于不区分大小写的匹配


您的演示与表名、创建表后的所有内容都匹配,直到包含(.I需要其他内容,如上所述……我知道我的工作原理,它还为您提供准确的“预期结果”如您所问。您检查了演示了吗?好的,您匹配了所有内容,并将匹配的字符串替换为自身加上一个换行符。这很有效,谢谢。是的,
\0
引用了整个匹配,然后我们添加了
\n
。如果有帮助,请接受:)什么意思(?.i)for?使其不区分大小写。您可能也应该在我的示例中使用此选项:)
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')
;
>>> re.sub(r'(?i)(CREATE *TABLE[^(]*\()', "\\1\n", data)