有什么方法可以轻松地交换字符串中的两个字符?

时间:2019-10-25 03:55:33

标签: python python-3.x string swap

例如 输入:

text = 'wish you “happy” every (day)'

预期输出:

text = 'wish you (happy) every “day”'

我想在一个未知的文本中到处都用括号将引号引起来。 我正在做学校作业,但不允许使用列表!!! 由于字符串是不可变的,因此我不确定该怎么办。请帮忙!

3 个答案:

答案 0 :(得分:1)

这是一个使用string.replace()的愚蠢答案:

text = 'wish you “happy” every (day)'

text = text\
    .replace('”', '*')\
    .replace('“', "^")\
    .replace("(", '“')\
    .replace(")", '”')\
    .replace("*", ')')\
    .replace("^", '(')

这是一个认真的答案:

由于您有要替换的字符列表,请构建一个应将哪个字符替换为另一个字符的字典,然后遍历字符串并创建一个新字符串,其中包含带有替换字母的原始字符串。这样,您可以根据需要在切换字典中包含任意多个字符串,并且无需修改即可使用。考虑到更大的范围,您可能想要做一些事情,例如将该字典存储在其他位置,例如,如果要基于从界面或Web应用程序获得的用户输入来创建字典。最好将规范的工作与工作方式分开,因为一个可以被视为数据(交换哪些字符),而另一个则被视为逻辑(实际上交换它们)。

text = 'wish you “happy” every (day)'

newtext = ''
switch = {
    '“': '(', 
    '”': ')',
    '(': '“', 
    ')': '”',
}

for letter in text:
    if letter in switch: letter = switch[letter]
    newtext += letter

我采用迭代方法的原因是因为我们要交换字符,因此,如果您同时替换每个字符的所有实例,则在交换下一个字符时,字符将被交换回,除非您包括一个中间步骤,例如我愚蠢的答案中的*或其他答案中的###带来了冲突的可能性(如果您的文本已经包含###*,则会被错误地替换)。

字符串的不变性是为什么您必须创建newtext字符串而不是在迭代时替换原始字符串中的字符的原因。

答案 1 :(得分:1)

中间替换通常很容易受到攻击,因为文本可能包含中间表示:Roopak中的###...### Nelliat的答案,Ryan的“傻”中的*^(编辑:as在以下Ryan的较严肃的文字中提到)。

这是一个正则表达式解决方案,无需进行中间替换:

text = 'wish you "happy" every (day)'
def replacer(match):
    quote, content = match.groups()
    if quote:
        return f'({content})'
    else:
        return f'"{content}"'
re.sub(r'(?:(")|\()(.*?)(?(1)"|\))', replacer, text)
# => 'wish you (happy) every "day"'

正则表达式将匹配起始定界符("(),然后匹配内容,以及匹配的最终定界符(即,如果起始定界符为",则匹配{{1} }(如果没有,则")。然后replacer函数用另一组定界符构造一个替换。

答案 2 :(得分:0)

您需要的是正则表达式替换。同样,该组应保留。

注意:由于存在交换,我不得不使用3个替换项。

a = 'wish you "happy" every (day)'
b = re.sub(r'"(\w+)"', r'###\1###', a) 
// replaces words inside double quotes to words inside ###
// b = 'wish you ###happy### every (day)'

c = re.sub(r'\((\w+)\)', r'"\1"', b)
// replaces words inside paranthesis to words inside double quotes
// c = 'wish you ###happy### every "day"'

d = re.sub(r'###(\w+)###', r'(\1)', c)
// replaces the words inside ### to paranthesis
// d = 'wish you (happy) every "day"'
相关问题