re.sub不能替换所有的出现

2024-04-29 17:06:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我不是Python开发人员,但我使用Python脚本来convert SQLite to 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”。

如果你能告诉我为什么我只看到第一次出现的东西被替换掉,我会很感激的,谢谢。


Tags: re脚本trueconvertsqlite开发人员isline
3条回答

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

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

此版本使用lookahead和lookbehind语法,如here所述。

怎么样

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

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

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

换句话说,要替换的后续匹配项不能重叠。

相关问题 更多 >