如何在字符串中进行条件字符替换

时间:2009-12-04 19:38:07

标签: python string replace conditional

我在Python中有一个unicode字符串,基本上需要逐个字符地完成,并根据规则列表替换某些字符串。其中一条规则是a如果öa之后,则会更改为n。此外,如果一行中有两个元音字符,则它们会被一个元音字符:替换。因此,如果我有字符串"natarook",获取"nötaro:k"的最简单,最有效的方法是什么?如果重要的话,使用Python 2.6和CherryPy 3.1。

编辑:连续两个元音的意思是相同的元音(oo,aa,ii)

5 个答案:

答案 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