2016-04-06 42 views
1

我想模式匹配並用Python 2.7替換第一人稱與第二人稱。Python 2.7的正則表達式捕獲組不按預期工作

string = re.sub(r'(\W)I(\W)', '\g<1>you\g<2>',string) 
string = re.sub(r'(\W)(me)(\W)', '\g<1>you\g<3>',string) 
# but does NOT work 
string = re.sub(r'(\W)I|(me)(\W)', '\g<1>you\g<3>',string) 

我想用正則表達式最後,但不知何故,捕捉組全亂了,甚至做了一個\ g < 0>呈現奇怪的,不規則的比賽。我認爲捕獲小組3將是最後一個詞的界限,但似乎並非如此。

樣本一句話可能是:I like candy.

我不感興趣,非常符合更換的正確性(我將永遠不會真正被選中,因爲我先走),但我不知道爲什麼捕捉組不按我期望的那樣工作。

謝謝!

+0

什麼是Python版本,順便說一句? –

+0

2.7!我會補充問題。 –

+0

然後,第三種模式至少有兩個問題:錯誤的變更邊界和非參與組替換。你不會得到''無與倫比的組''錯誤嗎? –

回答

2

嘗試使用以下正則表達式。

正則表達式:\b(I|me)\b

說明:

  • \b兩側標誌着字邊界。

  • (I|me)匹配Ime

注: -你可以把它區分大小寫使用i標誌。

Regex101 Demo

+0

這是一個更好的答案。但是你知道爲什麼交替似乎弄亂了捕獲組,使得捕獲組3不再是我期望的那個? –

+0

@NickAnderson:由於您使用了'\ W'而不是字邊界,因此當'I'位於字符串的開頭時會失敗。 '(\ W)(me)| I(\ W)'也會工作[Demo](https://regex101.com/r/gS0iA7/2),但使用字邊界更安全。 –

+0

這是真的。但比較:string = re.sub(r'(\ W)I |(me)(\ W)','\ g <3>',string)和string = re。sub(r'(\ W)(I | me)(\ W)','\ g <1> you \ g <3>',string),爲什麼組不同?爲什麼使捕獲組嵌套在交替操作符下會改變它的工作方式?我在Python文檔上看到,您也可以使用<2>來引用嵌套級別,那麼基於上下文的意義更改也是如此? –

相關問題