2017-09-22 61 views
2

我試圖通過插入一個非字母組的字符分隔一個單詞與兩個相鄰的元音。當我使用re.sub()進行非空替換時,結果顯示插入,但插入似乎已「吃掉」了以下字符。re.sub()與非空替換吃下面的字符在Python

下面是一個例子」

import = re 

word = "aorta" 

re.sub('(?<=[AEOUaeouy])(?:[aeoui])', '[=]', word) 
#actual output => 'a[=]r[=]ta' 
#expected output => 'a[=]or[=]ta' 

爲什麼下面插入字符吃掉了?

+0

您想要向前看,而不是一個非捕獲組 - 「(?:[aeoui])'>'(?= [aeoui])'。順便說一句,爲什麼'a [=]或[=] ta'預計? –

+0

Omg,你是對的!謝謝!如果你使用這個作爲迴應,我會接受它。 –

+0

我認爲你的預期結果是'a [=] orta',對吧? '[AEOUaeouy]'不包含'r' –

回答

2

您應該使用positive lookahead(非消費模式對一些字符的存在,而不只檢查實際上將它們添加到匹配值中),而不是非捕獲組(消耗模式,將匹配的字符放入匹配值中,並替換爲re.sub

使用

import re 
word = "aorta" 
print(re.sub('([AEOUaeouy])(?=[aeoui])', r'\1[=]', word)) 
# => a[=]orta 

查看Python demo

注意:如果你希望得到'a[=]or[=]ta',添加r的回顧後字符類,[AEOUaeouy] =>[AEOUaeouyr]

詳細

  • ([AEOUaeouy]) - 組1:在圖案
  • (?=[aeoui])定義的字符中的任何一個 - 其後面是與在字符類
  • \1的字符的位置 - 在替換模式插入用組1捕獲的值。