我在Python中有一个unicode字符串,基本上需要逐个字符地完成,并根据规则列表替换某些字符串。其中一条规则是a
如果ö
在a
之后,则会更改为n
。此外,如果一行中有两个元音字符,则它们会被一个元音字符:
替换。因此,如果我有字符串"natarook"
,获取"nötaro:k"
的最简单,最有效的方法是什么?如果重要的话,使用Python 2.6和CherryPy 3.1。
编辑:连续两个元音的意思是相同的元音(oo,aa,ii)
答案 0 :(得分:7)
# -*- coding: utf-8 -*-
def subpairs(s, prefix, suffix):
def sub(i, sentinal=object()):
r = prefix.get(s[i:i+2], sentinal)
if r is not sentinal: return r
r = suffix.get(s[i-1:i+1], sentinal)
if r is not sentinal: return r
return s[i]
s = '\0'+s+'\0'
return ''.join(sub(i) for i in xrange(1,len(s)))
vowels = [(v+v, u':') for v in 'aeiou']
prefix = {}
suffix = {'na':u'ö'}
suffix.update(vowels)
print subpairs('natarook', prefix, suffix)
# prints: nötaro:k
prefix = {'na':u'ö'}
suffix = dict(vowels)
print subpairs('natarook', prefix, suffix)
# prints: öataro:k
答案 1 :(得分:2)
“我知道,我会使用正则表达式!”
但严重的是,正则表达式对于字符串操作非常有用。
您可以按规则编写一个,如下所示:
s/na/nö/g
s/([aeiou])$1/$1:/g
或者您可以在运行时从其他所有列出它们的来源生成它们。
答案 2 :(得分:2)
首先关注 easy 和更正,然后在分析表明其成为瓶颈的情况下考虑效率。
简单的方法是:
prev = None
for ch in string:
if ch == 'a':
if prev == 'n':
...
prev = ch
答案 3 :(得分:1)
根据你的规则,我会说你真的想要一个简单的状态机。嗯,第二个想法,也许不是;你可以随便回头看看。
我在Python中有一个unicode字符串,基本上需要逐个字符地完成,并根据规则列表替换某些字符串。一个这样的规则是,如果a在n之后,则a变为ö。此外,如果一行中有两个元音字符,它们将被一个元音字符替换:。所以,如果我有字符串,获得“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代码。
但更简单更好。以下是regexp方法的实际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"
答案 4 :(得分:1)
使用手工制作的正则表达式列表可能更简单,而不是逐步地对它们进行处理。我推荐以下代码。
import re
# regsubs is a dictionary of regular expressions as keys,
# and the replacement regexps as values
regsubs = {'na':u'nö',
'([aeiou])\\1': '\\1:'}
def makesubs(s):
for pattern, repl in regsubs.iteritems():
s = re.sub(pattern, repl, s)
return s
print makesubs('natarook')
# prints: nötaro:k