2014-05-21 140 views
1

我有一個文件,其中包括SQL-CREATE-TABLE命令conatains。 我想將所有SQL-CREATE-TABLE命令寫入一個列表(尚未實現),每個命令都在一個單獨的列表條目中。Python - 正則表達式,多個匹配

我的問題是,正則表達式只返回第一個匹配,但應該有更多。

源文件:

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

你能也許會告訴我,什麼是錯的嗎?

+1

您可能會受益於使用解析器而不是依靠r世俗表達。 https://github.com/andialbrecht/sqlparse –

+0

感謝提示 – royskatt

回答

2

你會使用finditer更好,因爲它返回一個match對象像search

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

謝謝,這樣做! – royskatt

1
+0

由於某些原因,正面預覽與re.findall不起作用,它只返回正則表達式的第一部分: print re.findall(r 「(CREATE \ sTABLE)。+?(?=;)」,data_utf8,re.MULTILINE | re.DOTALL) 返回: [u'CREATE TABLE',u'CREATE TABLE',u'CREATE TABLE' ] – royskatt

+0

只需使用這個正則表達式代替'CREATE \ sTABLE。+?(?=;)'' –

0

多虧了馬克的提示,低於現在的工作示例解決方案:

# -*- 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)