17

我不是 Python 开发人员,但我正在使用 Python 脚本将 SQLite 转换为 MySQL

正如他们所说,建议的脚本很接近,但没有雪茄。

给我的问题是:

line = re.sub(r"([^'])'t'(.)", r"\1THIS_IS_TRUE\2", line)

...当然,还有 false ('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”。

我很感激关于为什么我只看到第一次出现被替换的提示,谢谢。

4

4 回答 4

11

您在示例中想要的两个替换重叠 - 您的两个实例之间的逗号't'(.)在第一种情况下匹配,因此([^'])在第二种情况下永远没有机会匹配它。这个稍作修改的版本可能会有所帮助:

line = re.sub(r"(?<!')'t'(?=.)", r"THIS_IS_TRUE", line)

此版本使用前瞻和后瞻语法,在此处进行了描述。

于 2012-11-13T15:30:43.787 回答
3

怎么样

line = line.replace("'t'", "THIS_IS_TRUE").replace("'f'", "THIS_IS_FALSE")

不使用re. 这将替换所有出现的't'and 'f'。只要确保没有汽车被命名t

于 2012-11-13T15:25:07.543 回答
2

您看到的第一个匹配项是,'t',. Python 从下一个字符开始继续,即'(在第二个之前t),随后,它无法匹配该([^'])部分并跳过第二个't'

换言之,后续要替换的匹配项不能重叠。

于 2012-11-13T15:29:08.983 回答
1

使用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');
于 2012-11-13T15:29:31.883 回答