Python-Regex,多重匹配

Python-Regex,多重匹配,python,regex,python-2.7,Python,Regex,Python 2.7,我有一个文件,其中包括SQL CREATE TABLE命令。 我想将所有SQLCREATETABLE命令写入一个列表(尚未实现),每个命令都在一个单独的列表条目中 我的问题是,正则表达式只返回第一个匹配项,但应该还有更多匹配项 源文件: abcd something CREATE TABLE schema.test1(attribute1 DECIMAL(28, 7) NULL , ATTRIBUTE2 DECIMAL(28, 7) KEY NOT NULL , ATTRIBUTE3

我有一个文件,其中包括SQL CREATE TABLE命令。 我想将所有SQLCREATETABLE命令写入一个列表(尚未实现),每个命令都在一个单独的列表条目中

我的问题是,正则表达式只返回第一个匹配项,但应该还有更多匹配项

源文件:

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(attribute1 DECIMAL(28, 7)  NULL , 
ATTRIBUTE2 DECIMAL(28, 7)  KEY  NOT NULL , 
ATTRIBUTE3 DECIMAL(28, 7)  NOT NULL , 
SET("db_alias_name" = 'TEST')
;

something else
CREATE TABLE schema.test3(attribute1 DECIMAL(28, 7)  NULL , 
ATTRIBUTE2 DECIMAL(28, 7)  KEY  NOT NULL , 
ATTRIBUTE3 DECIMAL(28, 7)  NOT NULL , 
SET("db_alias_name" = 'TEST')
;
something else
12346
higkl
我的脚本只返回第一个匹配项:

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')
脚本:

# -*- coding: utf-8 -*-
import os
import re

create_table_parts = []

atlfile = 'example.txt'
data = ''

def read_file(afile):
    with open(afile) as atl:
        text = atl.read()
        return text

data = read_file(atlfile)
data_utf8 = unicode(data, "utf-8")

round1 = re.search(r"(CREATE\sTABLE).+?(?=;)", data_utf8, re.MULTILINE|re.DOTALL)
print round1.group()

您可以告诉我,这里出了什么问题吗?

您可以使用
findall
来代替,请参见您最好使用,因为它会返回一个
匹配
对象,如
搜索

someIter = re.finditer(r"(CREATE\sTABLE).+?(?=;)", data_utf8, re.MULTILINE|re.DOTALL)
for mObj in someIter:
    # process mObj

感谢Mark的提示,下面是一个可行的示例解决方案:

# -*- coding: utf-8 -*-
import os
import re

create_table_parts = []
atlfile = 'example.txt'
data = ''

def read_file(afile):
    with open(afile) as atl:
        text = atl.read()
        return text

data = read_file(atlfile)
data_utf8 = unicode(data, "utf-8")


def round1_get_CT(text):
    match_list = []
    someIter = re.finditer(r"(CREATE\sTABLE).+?(?=;)", text, re.MULTILINE|re.DOTALL)
    for mObj in someIter:
        #print mObj.group()
        match_list.append(mObj.group())
    return match_list

create_table_parts = round1_get_CT(data_utf8)

print "\n".join(create_table_parts)

出于某种原因,正向前瞻不使用re.findall,它只返回正则表达式的第一部分:print re.findall(r“(CREATE\sTABLE)。+?(?=;)”,data_utf8,re.MULTILINE | re.DOTALL)返回:[u'CREATE TABLE',u'CREATE TABLE',u'CREATE TABLE']只需使用这个正则表达式即可“使用解析器而不是依赖正则表达式可能会使您受益匪浅。