如何在Python中用字符串替换字符集或字符组

Bla*_*cho 4 replace set replaceall python-3.x

我正在尝试制作一个简单的脚本来替换文本中某些特定组或一组字符(或一组字符串)的所有出现。

在这种情况下,我将尝试用特定字符串替换所有字母“ a,e,i,o,u”。

我的剧本:

def replace_all(text, repl):
    text1 = text.replace("a", repl)
    text2 = text1.replace("e", repl)
    text3 = text2.replace("i", repl)
    text4 = text3.replace("o", repl)
    text5 = text4.replace("u", repl)
    return text5
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?如果我需要替换更大的一组字符或字符串怎么办?这样链接起来似乎并不那么有效。

这也许是一个原始的问题。但是,我仍处于学习阶段,因此也许以后的课程中会有所帮助。预先感谢您的任何建议。

Joe*_*don 5

我的知识告诉我,有3不同的方法可以做到,所有这些方法都比您的方法短:

  • 用一个 for-loop
  • 用一个 generator-comprehension
  • 使用 regular expressions

首先,使用for-loop。这可能是对代码的最直接的改进,实际上只是将on 的5.replace减少到2

def replace_all(text, repl):
    for c in "aeiou":
        text = text.replace(c, repl)
    return text
Run Code Online (Sandbox Code Playgroud)

您还可以generator-comprehension结合使用,和str.join方法在一行中完成此操作。这将更快(如果很重要),因为它很复杂,O(n)因为我们将遍历每个字符并对其进行一次评估(第一种方法是复杂性,O(n^5)因为Python将为text不同的替换循环5次)

因此,此方法很简单:

def replace_all(text, repl):
    return ''.join(repl if c in 'aeiou' else c for c in text)
Run Code Online (Sandbox Code Playgroud)

最后,我们可以使用re.sub来代替set中的所有字符:[aeiou]text repl。这是最短的解决方案,可能是我推荐的解决方案:

import re
def replace_all(text, repl):
    return re.sub('[aeiou]', repl, text)
Run Code Online (Sandbox Code Playgroud)

正如我在开始时所说的,所有这些方法都可以完成任务,因此我没有提供单独的测试用例,但它们确实可以如本测试所示工作:

>>> replace_all('hello world', 'x')
'hxllx wxrld'
Run Code Online (Sandbox Code Playgroud)

更新资料

一种新方法引起了我的注意:str.translate

>>> {c:'x' for c in 'aeiou'}
{'a': 'x', 'e': 'x', 'i': 'x', 'o': 'x', 'u': 'x'}
>>> 'hello world'.translate({ord(c):'x' for c in 'aeiou'})
'hxllx wxrld'
Run Code Online (Sandbox Code Playgroud)

这种方法也O(n)很有效,因此与前两种方法一样有效。