替换字符串中多个字符的最有效方法

2024-06-10 07:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个任意长度的字符串,它只包含字母a到D:

s1 = 'ACDCADBCDBABDCBDAACDCADCDAB'

用“C”替换每个“B”,用“B”替换每个“C”,最有效/最快的方法是什么。

我现在要做的是:

replacedString = ''
for i in s1:
    if i == 'B':
        replacedString += 'C'
    elif i == 'C':
        replacedString += 'B'
    else:
        replacedString += i

这很管用,但显然不是很优雅。问题是,我处理的字符串可能是百万个字符中的一个,所以我需要一个更好的解决方案。

我想不出用.replace()方法来实现这一点的方法。This表明也许正则表达式是解决问题的方法。这里也适用吗?如果是,那么什么是合适的正则表达式?还有更快的方法吗?

谢谢你。


Tags: 方法字符串inforif字母解决方案this
3条回答

使用正则表达式,它还处理大小写敏感度,例如,如果字符串中必须替换的字母表是小写的,则它将替换为小写替换字符,否则为大写:

import re

chars_map = {'b': 'c', 'c': 'b'} # build a dictionary of replacement characters in lowercase

def rep(match):
    char = match.group(0)
    replacement = chars_map[char.lower()]
    return replacement if char.islower() else replacement.upper()

s = 'AbC'
print re.sub('(?i)%s' % '|'.join(chars_map.keys()), rep, s) # 'AcB'

除了str.translate方法之外,您只需构建一个翻译dict并自己运行它。

s1 = 'ACDCADBCDBABDCBDAACDCADCDAB'

def str_translate_method(s1):
    try:
        translationdict = str.maketrans("BC","CB")
    except AttributeError: # python2
        import string
        translationdict = string.maketrans("BC","CB")
    result = s1.translate(translationdict)
    return result

def dict_method(s1):
    from, to = "BC", "CB"
    translationdict = dict(zip(from, to))
    result = ' '.join([translationdict.get(c, c) for c in s1])
    return result

我想告诉你不恰当翻译的后果。假设我们有一个像字符串一样的DNA序列,我们想翻译成RNA字符串。一种方法使用不正确的替换,而另一种方法使用字符串连接。

string = 'GGGCCCGCGCCCGGG' # DNA string ready for transcription

更换

替换的问题是已经替换的字母将在以后的迭代中替换。例如,您可以看到,一旦完成,您将拥有一个相同字母的字符串,而不是完全反转。

string = 'GGGCCCGCGCCCGGG'

coding = {'A': 'U', 'T': 'A',
          'G': 'C', 'C': 'G'}

for k, v in coding.items():
    string = string.replace(k, v)

print string

串联

相反,请使用不同字符串的字符串连接。因此,您可以保留原始字符串,而不会错误地替换。当然可以使用字符串翻译,但我倾向于使用字典,因为根据定义,它们映射值。

string = 'GGGCCCGCGCCCGGG'

coding = {'A': 'U', 'T': 'A',
          'G': 'C', 'C': 'G'}

answer = ''

for char in string:
    answer += coding[char]

print answer

相关问题 更多 >