Учитывая ваши правила, я бы сказал, что вы действительно хотите простой государственную машину. Хм, по-другому, может быть, нет; вы можете просто оглянуться назад в строке, когда идете.
У меня есть строка в Юникоде в Python и в основном нужно пройти через символ по символу и заменить некоторые из них на основе списка правил. Одно из таких правил состоит в том, что a изменяется на ö, если a после n. Кроме того, если в строке есть два символа гласных, они заменяются одним гласным символом и:. Итак, если у меня есть строка, то какой самый простой и эффективный способ получить «nötaro: k»? Используя Python 2.6 и CherryPy 3.1, если это имеет значение.
vowel_set = frozenset(['a', 'e', 'i', 'o', 'u', 'ö'])
def fix_the_string(s):
lst = []
for i, ch in enumerate(s):
if ch == 'a' and lst and lst[-1] == 'n':
lst.append('ö')
else if ch in vowel_set and lst and lst[-1] in vowel_set:
lst[-1] = 'a' # "replaced by one vowel character", not sure what you want
lst.append(':')
else
lst.append(ch)
return "".join(lst)
print fix_the_string("natarook")
EDIT: Теперь, когда я увидел ответ @Anon. Я думаю, что это самый простой подход. Это может быть быстрее, если вы получите целую кучу правил в игре, так как это делает один проход над строкой; но, возможно, нет, потому что регулярное выражение в Python является быстрым кодом C.
Но проще, лучше. Вот реальный код Python для подхода regexp:
import re
pat_na = re.compile(r'na')
pat_double_vowel = re.compile(r'([aeiou])[aeiou]')
def fix_the_string(s):
s = re.sub(pat_na, r'nö', s)
s = re.sub(pat_double_vowel, r'\1:', s)
return s
print fix_the_string("natarook") # prints "nötaro:k"
Вы должны быть более ясными в отношении правила «двух гласных символов в строке» - предполагается, что оно применяется к «книгам», но не для «медведя». –
Это как вытаскивание зубов - если два символа гласных не обязательно должны быть равными, какой появляется в замене? –
Да, я имею в виду два двойных гласных подряд (ii, aa, oo) – roflwaffle