【发布时间】:2021-12-12 00:02:33
【问题描述】:
我有一个架构文件,其中包含我的数据库的所有创建语句,我想将它们拆分以获取每个单独的语句:
CREATE TABLE leads (
id integer PRIMARY KEY,
first_name text NOT NULL,
email text NOT NULL
);
CREATE TABLE lead_logs (
id INTEGER PRIMARY KEY,
old_id int,
new_id int,
old_email text,
new_email text
);
CREATE TRIGGER validate_email_before_insert_leads
BEFORE INSERT ON leads
BEGIN
SELECT
CASE
WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
RAISE (ABORT,'Invalid email address')
END;
END;
CREATE TRIGGER log_contact_after_update
AFTER UPDATE ON leads
WHEN old.phone <> new.phone
OR old.email <> new.email
BEGIN
INSERT INTO lead_logs VALUES(
old.id,
new.id,
old.email,
new.email
);
END;
当我只有 CREATE TABLE 语句时,我可以通过拆分 ; 上的文本来工作,但现在我也有 CREATE TRIGGER 与 BEGIN 和 END 命令,这也得到一个分号,我需要一种更智能的方法来提取完整的语句。
由于每个语句都以CREATE 开头并在以下CREATE 之前以;\n 结尾,我虽然可以使用DOTALL 标志编译(CREATE.*;)\nCREATE,因此换行符由点考虑,但python 的@ 987654331@ 仅返回包含除最后一条语句之外的所有内容的单个提取。
虽然它可能与子组有关,但((CREATE.*;)\n)* 仅返回空字符串,CREATE.*;\n 将返回整个原始文本。
我可以使用 python 简单地在 CREATE 序列前面加上其他东西并拆分,但这似乎相当原始:
txt.replace('CREATE', 'OOGABOOGA-CREATE').split('OOGABOOGA-')
我确定这在正则表达式中非常简单,但我无法理解它,有人可以帮我吗?
【问题讨论】:
-
使用 split() 分割起始文本上的记录。
-
拆分单词
CREATE-split("CREATE")- 然后将单词CREATE添加到结果中。也许它是有前途的,但它可以工作,并且可能对于长字符串它可以比regex更快地工作