简体   繁体   中英

Regex to find all lines between start and end

I am trying to get all lines between a line that matches a specific string until the occurrence of end line. The beginning pattern and end pattern could be in different places in the same file. My intention is to get the block of lines between the multiple occurrences. Basically, my file could like below

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;
/

Expected Output:

Match 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;
/

Match 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;
/

My pseudo code is as follows, however I doesn't get the lines between the second matched line (CREATE OR REPLACE TRIGGER ME) since there is additional parenthesis. Is there any better way to get the desired output?

    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()

Error:

CREATE OR REPLACE TRIGGER ME\(ticket varchar2, note varchar2\) AS
AttributeError: 'NoneType' object has no attribute 'group'

Using re.findall --> Lookbehind & Lookahead

Demo:

import re
for i in  re.findall(r"(?<=CREATE OR REPLACE).*?(?=\/)", s, flags=re.MULTILINE|re.DOTALL):
    print("CREATE OR REPLACE" + i)
    print("---")

Output:

 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;

----

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM