我的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'>
答案 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显示了如何使用正则表达式删除转义序列。然后一切都像预期的那样工作。