Python-Regex,多重匹配
我有一个文件,其中包括SQL CREATE TABLE命令。 我想将所有SQLCREATETABLE命令写入一个列表(尚未实现),每个命令都在一个单独的列表条目中 我的问题是,正则表达式只返回第一个匹配项,但应该还有更多匹配项 源文件: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
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']只需使用这个正则表达式即可“使用解析器而不是依赖正则表达式可能会使您受益匪浅。