仅替换匹配表达式中的特定组

时间:2012-02-20 11:19:35

标签: python regex

我正在解析我想要进行更改的文本,但仅限于特定的行。

我有一个正则表达式模式,如果它是一条感兴趣的行,它会捕获整行,并且在表达式中我有一个我想要改变的东西的记忆组。

我希望能够仅更改匹配表达式中的特定组,而不是替换整个表达式(将替换整行)。

例如:

我有一个文字文件:

This is a completely silly example.
something something "this should be replaced" bla.
more uninteresting stuff

我有正则表达式: pattern = '.*("[^"]*").*'

然后我抓住第二行,但我只会替换行内的"this should be replaced"匹配组,而不是整行。 (因此使用re.sub(pattern, replacement, string)将无法胜任。

提前致谢!

3 个答案:

答案 0 :(得分:2)

有什么问题
r'"[^"]+"'

匹配表达式之前和之后的.*也匹配零长度字符串,因此根本不需要它。

re.sub(r'"[^"]+"', 'DEF', 'abc"def"ghi')
# returns 'abcDEFghi'

并且您的示例文本将导致:

'This is a completely silly example.\nsomething something DEF bla.\nmore uninteresting stuff

答案 1 :(得分:2)

在这种情况下,eumiro答案是最好的,但为了完整起见,如果你真的需要对pre,inside和post文本执行一些更复杂的处理,你可以简单地使用多个组,如:

'(.*)("[^"]*")(.*)'

(第一组提供之前的文本,第三组提供之后的文本,用它们做你喜欢的事情)

此外,您可能更愿意“禁止在前部:

'([^"]*)("[^"]*")(.*)'

答案 2 :(得分:2)

re.matchre.search会返回“匹配对象”。 (参见python文档)。假设您要替换RE中的第3组,请拉出其开始/结束索引并直接替换子字符串:

mobj = re.match(pattern, line)
start = mobj.start(3)
end = mobj.end(3)
line = line[:start] + replacement + line[end:]