Python 正则表达式查找开始和结束之间的所有行
我正在尝试获取与特定字符串匹配的行之间的所有行,直到出现结束行。开始模式和结束模式可以位于同一文件中的不同位置。我的目的是获取多个引用之间的行块。基本上,我的文件如下所示Python 正则表达式查找开始和结束之间的所有行,python,regex,python-2.7,Python,Regex,Python 2.7,我正在尝试获取与特定字符串匹配的行之间的所有行,直到出现结束行。开始模式和结束模式可以位于同一文件中的不同位置。我的目的是获取多个引用之间的行块。基本上,我的文件如下所示 CREATE OR REPLACE TRIGGER "ckjsdnvjn" (ID number, Type varchar2) BEFORE UPDATE OR INSERT ON TRIGGER_NAME FOR EACH ROW BEGIN IF INSERTING THEN :NEW.CREATED_D
CREATE OR REPLACE TRIGGER "ckjsdnvjn" (ID number, Type varchar2)
BEFORE UPDATE OR INSERT ON TRIGGER_NAME
FOR EACH ROW
BEGIN
IF INSERTING THEN
:NEW.CREATED_D := SYSTIMESTAMP;
ELSE
:NEW.CREATED_D := :OLD.CREATED_D;
END IF;
:NEW.MODIFIED_D := SYSTIMESTAMP;
END;
/
CREATE TABLE kjjknvfskjn
(
ID NUMBER(19,0) NOT NULL,
GRADE VARCHAR2( 4 ) NOT NULL,
MODIFIED_D TIMESTAMP,
CONSTRAINT jnflkvndflkn PRIMARY KEY( ID )
);
CREATE SEQUENCE kcnvlfnvlfnlk;
CREATE OR REPLACE TRIGGER ME(ticket varchar2, note varchar2) AS
BEGIN
INSERT INTO jknsfjknv(
cnkj,
kknvlfn
)
VALUES (
SYS_CONTEXT('lknvl','kvnldfkn'),
'(kljkcsn: ' || lkdnv || ') ' || lknv
);
END ME;
/
预期产出:
匹配1:
CREATE OR REPLACE TRIGGER "ckjsdnvjn" (ID number, Type varchar2)
BEFORE UPDATE OR INSERT ON TRIGGER_NAME
FOR EACH ROW
BEGIN
IF INSERTING THEN
:NEW.CREATED_D := SYSTIMESTAMP;
ELSE
:NEW.CREATED_D := :OLD.CREATED_D;
END IF;
:NEW.MODIFIED_D := SYSTIMESTAMP;
END;
/
比赛2:
CREATE OR REPLACE TRIGGER ME(ticket varchar2, note varchar2) AS
BEGIN
INSERT INTO jknsfjknv(
cnkj,
kknvlfn
)
VALUES (
SYS_CONTEXT('lknvl','kvnldfkn'),
'(kljkcsn: ' || lkdnv || ') ' || lknv
);
END ME;
/
我的伪代码如下所示,但是我没有得到第二个匹配行CREATE或REPLACE TRIGGER ME之间的行,因为还有额外的括号。有没有更好的方法来获得期望的输出
with open(local_file, 'r') as f:
textfile_temp = f.read()
lines = textfile_temp.splitlines()
STRING = 'CREATE OR REPLACE TRIGGER'
SEARCH_END_STRING = 'end;'
for line in lines:
if re.search(STRING, line, re.IGNORECASE):
line = line.strip()
line = line.replace('(', '\(')
line = line.replace(')', '\)')
print line
SEARCH_PATTERN = r'(' + line + ')(.*?)(' + SEARCH_END_STRING + ')'
SEARCH_REGEX = re.compile(SEARCH_PATTERN, re.IGNORECASE|re.DOTALL|re.MULTILINE)
match = SEARCH_REGEX.search(textfile_temp)
print match.group()
错误:
CREATE OR REPLACE TRIGGER ME\(ticket varchar2, note varchar2\) AS
AttributeError: 'NoneType' object has no attribute 'group'
使用re.findall->lookback和Lookahead
演示:
感谢@Rakesh,它像一个charmin一样工作。在某些情况下,我需要在整行和/之间进行匹配,因此,我不只是搜索“CREATE或REPLACE”,而是逐行循环,即“CREATE或REPLACE TRIGGER ckjsdnvjn ID number,键入varchar2”将其转义并在整行和/之间进行搜索。但这里的挑战是,有时整行代码在同一个文件中的其他地方重复,因此re.findall给了我2个块。如果已经找到匹配项,是否仍可以跳过re.findall?
import re
for i in re.findall(r"(?<=CREATE OR REPLACE).*?(?=\/)", s, flags=re.MULTILINE|re.DOTALL):
print("CREATE OR REPLACE" + i)
print("---")
CREATE OR REPLACE TRIGGER "ckjsdnvjn" (ID number, Type varchar2)
BEFORE UPDATE OR INSERT ON TRIGGER_NAME
FOR EACH ROW
BEGIN
IF INSERTING THEN
:NEW.CREATED_D := SYSTIMESTAMP;
ELSE
:NEW.CREATED_D := :OLD.CREATED_D;
END IF;
:NEW.MODIFIED_D := SYSTIMESTAMP;
END;
----
CREATE OR REPLACE TRIGGER ME(ticket varchar2, note varchar2) AS
BEGIN
INSERT INTO jknsfjknv(
cnkj,
kknvlfn
)
VALUES (
SYS_CONTEXT('lknvl','kvnldfkn'),
'(kljkcsn: ' || lkdnv || ') ' || lknv
);
END ME;
----