Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式查找开始和结束之间的所有行_Python_Regex_Python 2.7 - Fatal编程技术网

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;

----