Pythonic方式替换多个字符

时间:2018-04-16 10:11:43

标签: python string

我创建了一次性功能

a = lambda x: x.replace('\n', '')
b = lambda y: y.replace('\t', '').strip()
c = lambda x: b(a(x))

是否有 Pythonic compact 方式( one liner?),以提高可读性和性能。主要表现。

(注意:我知道我可以做lambda x: x.replace('\n').replace('\t\).strip()但是没有做任何事情。最好是有一种内置的方法来处理我不知道的这类问题,我知道这些表现改进可以忽略不计。)

输入: 'my \t\t\t test, case \ntest\n LoremIpsum'

期望的输出: 'my test, case test LoremIpsum'

2 个答案:

答案 0 :(得分:2)

选项1
str.translate
对于初学者来说,如果你用相同的东西替换很多角色,我会100%推荐str.translate

>>> from string import whitespace as wsp
>>> '\n\ttext   \there\r'.translate(str.maketrans(dict.fromkeys(wsp, '')))
'texthere'

此语法仅对python-3.x有效。对于python-2.x,您需要import string并使用string.maketrans来构建映射。

如果你想排除空白字符,那么

wsp = set(wsp) - {' '}

选项2
re.sub
与上述相同的正则表达式将使用re.sub

>>> import re
>>> re.sub(r'\s+', '', '\n\ttext   \there\r')
'texthere'

然而,表现明智,str.translate击败了这一手。

答案 1 :(得分:1)

改进非常简单:

删除lambdas。 str.replace()方法是一个函数,在您的代码片段的第一行中,您定义了一个调用另一个函数的函数,而不是其他函数。你为什么需要包裹lambda?第二行也是如此。

使用返回值。实际上,在docs我们看到:

  

返回字符串的副本,其中所有出现的substring old都替换为new。

所以你可以先做replace(),然后再对获得的结果做第二次

总而言之,您将拥有:

c = x.replace('\n', '').replace('\t', '').strip()

注意:如果要删除多个字符,最好使用str.translate(),但其中两个str.replace()的可读性更高。

干杯!