2012-02-20 42 views
1

我正在解析文本,我想在其中進行更改,但僅限於特定行。只替換匹配表達式中的特定組

我有一個正則表達式模式,捕捉整條線,如果它是一條感興趣的線,並且在表達式中我有一個記憶中的組,我真的想改變它。

我想只能在匹配的表達式中更改特定的組,而不是替換整個表達式(將替換整個行)。

例如:

我有一個文本文件:

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)不會做的工作。

提前感謝!

回答

2

這有什麼錯

r'"[^"]+"' 

.*前後匹配的表達式匹配零長度字符串之後了,所以你不需要它了

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

和您的示例文本將導致到:

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

eumiro答案在這種情況下是最好的,但爲了完整起見,如果您確實需要執行一些更復雜的預處理,內部處理和後處理文本處理,則可以簡單地使用多個組,如:

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

(第一組之前提供的文字,之後第三個文本,做你與他們喜歡)

此外,您可能希望禁止「在預部分:

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

您不能選擇使用替代雖然。 – Moondra 2017-08-14 22:52:42

1

re.matchre.search返回「匹配對象」。 (請參閱python文檔)。假設你要替換組3在你的RE,拉出它的開始/結束索引和直接替換字符串:

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