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

时间:2018-01-19 22:42:29

标签: python-3.x replace set replaceall

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

在这种情况下,我会尝试更换所有字母" 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

有没有更简单的方法呢?如果我需要更换更大的字符串或字符串怎么办?像这样链接它似乎并没有真正有效。

这可能是一个原始问题。但是,我仍处于学习阶段,所以也许我会在以后的课程中得到它。提前感谢您的任何建议。

3 个答案:

答案 0 :(得分:4)

我的知识告诉我有3个不同的方法,所有这些都比你的方法短:

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

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

def replace_all(text, repl):
    for c in "aeiou":
        text = text.replace(c, repl)
    return text

您也可以使用generator-comprehension并使用str.join方法在一行中执行此操作。这会更快(如果这很重要),因为它具有复杂性O(n),因为我们将遍历每个字符并评估它一次(第一个方法是复杂性O(n^5),因为Python将循环通过text五次换取不同的替代品

所以,这种方法很简单:

def replace_all(text, repl):
    return ''.join(repl if c in 'aeiou' else c for c in text)

最后,我们可以使用re.sub替换集合中的所有字符:[aeiou],文字为repl。这是解决方案中最短的,也许我建议:

import re
def replace_all(text, repl):
    return re.sub('[aeiou]', repl, text)

正如我在开始时所说的那样,所有这些方法都完成了任务,因此我没有必要提供单独的测试用例,但它们确实可以在此测试中看到:

>>> replace_all('hello world', 'x')
'hxllx wxrld'

<强>更新

我注意到了一种新方法: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'

此方法也是O(n),因此效果与前两个一样有效。

答案 1 :(得分:1)

这是regular expression的好地方:

import re

def replace_all(text, repl):
    return re.sub('[aeiou]', repl, text)

这适用于您的问题中的情况,即您要替换单个字符。如果要替换一组较长的字符串:

def replace_all(text, to_replace, replacement):
    pattern = '|'.join(to_replace)
    return re.sub(pattern, replacement, text)

>>> replace_all('this is a thing', ['thi','a'], 'x')
'xs is x xng'

答案 2 :(得分:0)

所以你所做的事情是完全有效的,但有更好的方法。

以下是一些解决方案,运行时间超过100000次循环。

主要签名:

目标是您要替换的字符,repl是替换字符。

def replace_all(text, targets=['a', 'e', 'i', 'o', 'u'], repl='_'):
    text = # Something here to swap characters as an array
    return ''.join(text) # Stitch it back together

的ByteArray

Bytearray是一个可变数据结构,包含字符本身的列表。作为一种数据结构,它似乎是理想的选择,python中的字符串是不可变的,这可以防止不断构造/破坏。

[chr(c) if chr(c) not in targets else repl for c in bytearray(text, 'utf-8')]

以0.365运行

没有bytearray

这是在一个简单的列表上运行,列表本身是可变的,但字符是字符串,因此这里有一些技术上不可变结构的修改。

[c if c not in targets else repl for c in text]

以0.179

运行

地图

这会将函数映射到字符串中的每个字符。

map(lambda c: c if c not in targets else repl, text) 

以0.265运行