我正在解析我想要进行更改的文本,但仅限于特定的行。
我有一个正则表达式模式,如果它是一条感兴趣的行,它会捕获整行,并且在表达式中我有一个我想要改变的东西的记忆组。
我希望能够仅更改匹配表达式中的特定组,而不是替换整个表达式(将替换整行)。
例如:
我有一个文字文件:
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)
将无法胜任。
提前致谢!
答案 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)
'(.*)("[^"]*")(.*)'
(第一组提供之前的文本,第三组提供之后的文本,用它们做你喜欢的事情)
此外,您可能更愿意“禁止在前部:
'([^"]*)("[^"]*")(.*)'
答案 2 :(得分:2)
re.match
和re.search
会返回“匹配对象”。 (参见python文档)。假设您要替换RE中的第3组,请拉出其开始/结束索引并直接替换子字符串:
mobj = re.match(pattern, line)
start = mobj.start(3)
end = mobj.end(3)
line = line[:start] + replacement + line[end:]