Учитывая ваши правила, я бы сказал, что вы действительно хотите простой конечный автомат. Хм, если подумать, может и нет; вы можете просто оглянуться назад в строку, как вы идете.
У меня есть строка в кодировке Unicode в 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")
РЕДАКТИРОВАТЬ: Теперь, когда я увидел ответ @Anon. Я думаю, что это самый простой подход. Это может быть на самом деле быстрее, когда вы получаете целую кучу правил в игре, так как это делает один проход по строке; но, возможно, нет, потому что регулярные выражения в Python - это быстрый C-код.
Но чем проще, тем лучше. Вот фактический код Python для подхода регулярных выражений:
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"