2017-09-22 40 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捕获的值。