2009-12-08 52 views
1

这是参考一个问题,我之前here找到两个相同的字符在正则表达式

问我接到一个解决该问题,该问题的字符串,但最终需要用正则表达式去这个特定部分。

我需要一个正则表达式来搜索和替换一个字符串的行中的两个元音的实例是相同的,所以在“采取”,或“蜜蜂”的“ee”中的“oo”,并替换它其中一个被替换的字母和一个:

预期行为的一些例子:

"took"应该成为"to:k"

"waaeek"应该成为"wa:e:k"

"raaag"应该成为"ra:ag"

谢谢你的帮助。

+0

什么“raaaag”?应该改成'ra:a:g'吗? – 2009-12-08 17:27:01

+0

是的,会的。应该从左到右阅读(默认情况下它是这样做的) – roflwaffle 2009-12-08 18:15:02

回答

7

试试这个:

re.sub(r'([aeiou])\1', r'\1:', str) 
1

搜索([aeiou])\1\1:

取代它,我不知道Python,但你应该能够使正则表达式不区分大小写和全局的东西,如/([aeiou])\1/gi

+0

感谢SilentGhost的编辑。我不知道python语法 - 只是按照惯例。 – Amarghosh 2009-12-08 17:45:58

0

您需要在搜索表达式中使用反向引用。试试像这样:([a-z])+\1(或([a-z])\1只是一个双)。

0

不要做什么: 如前所述,这将匹配任何两个元音在一起。留下这个答案作为不做的一个例子。正确的答案(在这种情况下)是使用反向引用,如许多其他答案中所述。

import re 

data = ["took","waaeek","raaag"] 

for s in data: 
    print re.sub(r'([aeiou]){2}',r'\1:',s) 

这与集合[aeiou]中任何成员的两次出现{2}完全匹配。并与元音替换它,用括号捕获()和放置在由\ 1子串后面是“:”

输出:

to:k 
wa:e:k 
ra:ag 
+0

这将改变'teak'到'ta:k' – Amarghosh 2009-12-08 17:48:22

+0

重复适用于角色等级 - 所以任何两个连续的元音都会匹配。最后匹配的字符将被捕获(使用expresso进行测试)。 – Amarghosh 2009-12-08 17:50:26

+1

你每天都会在这个网站上学到新东西。你很对。 – 2009-12-08 17:59:04

相关问题