使用正则表达式查找并替换它之间的两个字符串

时间:2016-01-09 18:40:41

标签: python regex

在Python中,我尝试在正则表达式匹配之间替换两个字符串。

import re

a = "("
b = ")"
string = "foo bar foo foo bar bar foofoofoo foo foo"

regex = "(foo(.[foo]{1,}))|foo"
print(re.sub(regex, a + string + b, string))

我想要打印的内容:

(foo) bar (foo foo) bar bar (foofoofoo) (foo foo)

它实际印刷的内容:

(foo bar foo foo bar bar foofoofoo foo foo) bar (foo bar foo foo bar bar foofoofoo foo foo) bar bar (foo bar foo foo bar bar foofoofoo foo foo) (foo bar foo foo bar bar foofoofoo foo foo)

我应该使用循环还是有功能呢?

3 个答案:

答案 0 :(得分:2)

re.sub定义为

re.sub(pattern , <what to replace "pattern" with>, input_string)

您的代码要求re.sub将您匹配的模式替换为您所需的input_string括号,而不是您想要的。

如果您只想用括号替换所有foo,请尝试

regex = r"((foo){2,}|foo(\s+foo)*)"
a = "("
b = ")"
input_string = "foo bar foo foo bar bar foofoofoo foo foo"
print(re.sub(regex, a + r'\1' + b, input_string))

输出:

(foo) bar (foo foo) bar bar (foofoofoo) (foo foo)

答案 1 :(得分:2)

您没有使用原始匹配的反向引用。相反,您要将匹配替换为原始字符串。这就是你的字符串变长的原因。您需要使用C++1z来引用第一组括号中匹配的模式。

我使用了以下代码并获得了您想要的输出:

\1

编辑:我没有对标记为正确的答案发表评论的声誉(我的帐户在休眠后重置)。但是,根据原始问题,输出是错误的。

我得到了输出:

print(re.sub(r"((foo){2,}|foo(\s+foo)*)",r'(\1)',string))

编辑:我更正了原来的答案。我并不认为我可以凭借自己的声誉。

答案 2 :(得分:1)

您需要再次阅读re.sub的文档。这是它的定义:

re.sub(pattern, repl, string, count=0, flags=0)

您正在致电:

re.sub(regex, a + string + b, string)

无论匹配什么,您都将用匹配的整个原始string替换匹配。

你写的正则表达式有两个捕获组(由parens定义)。您可以在替换字符串中将其引用为\1\2。您需要将a+string+b替换为可以打印您要查找的内容的其他内容,而不是整个字符串。