python正则表达式:从文件读取时正则表达式失败

时间:2015-04-03 12:20:09

标签: python regex

我的regex

table_names = ['check_channel_types', 'qualitycheckresult']
tables_group = '|'.join(table_names)
pattern = re.compile('(CREATE TABLE "({0})"(.*?);)'.format(tables_group), re.DOTALL)
match = pattern.findall(s)

可以正常使用此测试字符串:

s ="""CREATE TABLE "check_boundary_nodes" (
    "id" serial NOT NULL PRIMARY KEY,
    "test_name" varchar(120),
    "field_name" varchar(120),
    "original_pk" varchar(15),
    "check_result" varchar(255),
    "constraint" varchar(120),
    "the_geom" geometry(GEOMETRY,28992)
)
;
CREATE TABLE "check_channel_types" (
    "id" serial NOT NULL PRIMARY KEY,
    "original_pk" integer CHECK ("original_pk" >= 0) NOT NULL,
    "channel_inp_id" integer CHECK ("channel_inp_id" >= 0),
    "type" integer CHECK ("type" >= 0),
    "suggested_type" integer CHECK ("suggested_type" >= 0),
    "the_geom" geometry(LINESTRING,28992)
)
;
CREATE TABLE "qualitycheckresult" (
    "id" serial NOT NULL PRIMARY KEY,
    "qualitycheck" varchar(512) NOT NULL,
    "created" timestamp with time zone NOT NULL,
    "result" integer NOT NULL,
    "resultvalue" varchar(256) NOT NULL,
    "message" varchar(512) NOT NULL,
    "object_id" integer,
    "object_type" varchar(512) NOT NULL,
    "old_value" text NOT NULL
)
;"""  

一旦我从类似文件的对象中读取文本,正则表达式就会失败(找不到任何匹配项)。我假设它与引号字符有关,但发现很难调试,因为我正在阅读'文件'很长真正令人感到奇怪的是,如果它是一个三重引用的字符串,它内部应该没有区别。任何帮助都非常感谢。这就是我在我的应用中检索数据的方式:

from StringIO import StringIO
content = StringIO()
call_command('sql', 'my_app', database=self.alias,
             stdout=content)
content.seek(0)
a = content.getvalue()
type(a)
>>> <type 'str'>

2 个答案:

答案 0 :(得分:0)

尝试将输出写为utf8编码。 并添加标志:

re.MULTILINE|re.DOTALL

到正则表达式。

f_stream = open( “my_dumpfile.txt”,     ‘w’, encoding=”utf-8″ )
call_command( “dumpdata”, indent=4, stdout=f_stream )

或者:

content = StringIO(content.read().decode('utf8'))

或者:

a = content.read().decode('utf8')

答案 1 :(得分:0)

好的,让我们把它包起来。

StringIO对象读取时正则表达式失败的原因是字符串包含ANSI转义序列(显然是为了给某些行提供不同的颜色)。 This answer显示了如何使用正则表达式删除转义序列。然后一切都像预期的那样工作。