re.sub不替换所有出现的事件

时间:2012-11-13 15:22:44

标签: python regex

我不是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'。

我很欣赏一个提示,为什么我只看到第一次更换,谢谢。

4 个答案:

答案 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');