我不是Python开发人员,但我使用的是Python脚本convert SQLite to MySQL
建议的剧本接近,但没有雪茄,正如他们所说。
给我一个问题的路线是:
line = re.sub(r"([^'])'t'(.)", r"\1THIS_IS_TRUE\2", line)
...当然还有等效的假('f')行。
我看到的问题是,只替换任何给定行中第一次出现't'。
所以,输入到脚本
INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'t','t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');
...给出...
INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,THIS_IS_TRUE,'t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');
我提到我不是Python开发人员,但我自己试图解决这个问题。根据文档,我了解re.sub应该替换所有出现的't'。
我很欣赏一个提示,为什么我只看到第一次更换,谢谢。
答案 0 :(得分:8)
您在示例中需要的两个替换重叠 - 在第一种情况下,'t'
的两个实例之间的逗号将与(.)
匹配,因此第二种情况中的([^'])
匹配案件永远不会有机会匹配它。这个稍微修改过的版本可能有所帮助:
line = re.sub(r"(?<!')'t'(?=.)", r"THIS_IS_TRUE", line)
此版本使用前瞻和后瞻语法,描述为here。
答案 1 :(得分:3)
怎么样
line = line.replace("'t'", "THIS_IS_TRUE").replace("'f'", "THIS_IS_FALSE")
不使用re
。这会替换所有't'
和'f'
。只需确保没有汽车被命名为t
。
答案 2 :(得分:2)
您看到的第一个匹配是,'t',
。 Python从下一个字符开始,即'
(在第二个t
之前),随后,它与([^'])
部分不匹配并跳过第二个't'
。
换句话说,要替换的后续匹配不能重叠。
答案 3 :(得分:0)
使用re.sub(r"\bt\b","THIS_IS_TRUE",line)
:
In [21]: strs="""INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'t','t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');"""
In [22]: print re.sub(r"\bt\b","THIS_IS_TRUE",strs)
INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'THIS_IS_TRUE','THIS_IS_TRUE','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');