2016-07-06 4 views
0

Мне нужно удалить любые «h» в строке, если это произойдет после гласного.Regex заменить условный символ

E.g. 
    John -> Jon 
    Baht -> Bat 
    Hot -> Hot (no change) 
    Rhythm -> Rhythm (no change) 

Поиск слов разве проблема, но удаляя «Н», как я все еще нужен оригинальный гласный звук. Можно ли это сделать в одном регулярном выражении?

ответ

2

Регулярное выражение для сопоставления h после гласного будет позитивным просмотром назад один

(?<=a|e|y|u|o|a)h 

И вы можете сделать

re.sub(r"([a-zA-Z]*?)(?<=a|e|y|u|o|a)h([a-zA-Z]*)",r"\1\2",s) 

Однако, если вы можете иметь более одного h после гласной строка, вам нужно будет выполнить несколько итераций, так как regex не поддерживает группы динамического сопоставления

import re 

s = "bahtbaht" 
s1 = s 

while True: 
    s1 = re.sub(r"([a-zA-Z]*?)(?<=a|e|y|u|o|a)h([a-zA-Z]*)",r"\1\2",s) 
    if len(s1) == len(s): 
     break 
    s = s1 

print(s1) 

В более правильной форме, используя функцию repl

import re 

def subit(m): 
    match, = m.groups() 
    return match 

s = "bahtbaht" 

print(re.sub(r"([a-zA-Z]*?)(?:(?<=a|e|y|u|o|a)h|$)",subit,s)) 

гораздо проще ответ, благодаря @tobias_k

re.sub(r"([aeiou])h", r"\1", s, flags = re.I) 
+1

Что случилось с 're.sub (г" ([AEIOU]) h ", r" \ 1 ", s)'? Кажется, все прекрасно работает. Кроме того, можно добавить флаг 're.I'. –

+0

@tobias_k ничего плохого, отредактируйте ответ, спасибо! – buld0zzr

+0

Ahhh .. its the() Я ошибался. Спасибо, парни – Horseshaq

Смежные вопросы