2016-08-19 64 views
0

假设您有一个要解析为特定格式的字符串。这意味着:替换全部' ', '.', '-', etc with '_'在Python中替换不同的字符

我知道我能做到这一点:

>s = "Hello----..... World" 
>s = s.replace('-','_').replace('.', '_').replace(' ', '_') 
>print s 
>Hello_____________World 

得到我想要的东西。但是,有没有更清晰的方法?更多pythonic的方式? 我尝试解析列表中的替换的第一个参数,但是这并没有很好地工作。

回答

1

可以使用str.translatestring.maketrans这将是不链接调用等最有效的方法做到这一点..:

In [6]: from string import maketrans 

In [7]: s = "Hello----..... World" 

In [8]: table = maketrans(' .-',"___") 

In [9]: print(s.translate(table)) 
Hello_____________World 

时序:

In [12]: %%timeit 
    ....: s = "Hello----..... World" 
    ....: table = maketrans(' .-',"___") 
    ....: s.translate(table) 
    ....: 

1000000 loops, best of 3: 1.14 µs per loop 

In [13]: timeit s.replace('-','_').replace('.', '_').replace(' ', '_') 
100000 loops, best of 3: 2.2 µs per loop 
In [14]: %%timeit              
text = "Hello----..... World" 
for ch in [' ', '.', '-']: 
    if ch in text: 
     text = text.replace(ch,'_') 
    ....: 
100000 loops, best of 3: 3.51 µs per loop 

In [18]: %%timeit 
....: s = "Hello----..... World" 
....: re.sub(r"[ .-]", "_", s) 
....: 
100000 loops, best of 3: 11 µs per loop 

即使预编译模式离开10μs所以正则表达式是迄今为止效率最低的方法。

In [20]: patt= re.compile(r"[ .-]") 

In [21]: %%timeit    
s = "Hello----..... World" 
patt.sub("_", s) 
    ....: 
100000 loops, best of 3: 9.98 µs per loop 

预创建表得到我们失望到纳秒:

In [22]: %%timeit              
s = "Hello----..... World" 
s.translate(table) 
    ....: 

1000000 loops, best of 3: 590 ns per loop 
1

使用使用正则表达式re

>>> import re 
>>> print re.sub(' |\.|-', '_',"Hello----..... World") 
Hello_____________World 

奖励解决方案

>>> keys = [' ', '.', '-'] 
>>> print ''.join('_' if c in keys else c for c in "Hello----..... World") 
Hello_____________World 
0

This answer列出了各种不同的方式来完成这项任务,通过速度对比不同的功能和输入。

如果您要更换少量字符,最快的方法就是通过链接多个替换,使用正则表达式是最慢的

如果你想使这个更“Python化”,最好的办法,以充分利用这两种速度可读性,是通过他们让你要替换的字符的列表和循环。

text = "Hello----..... World" 
for ch in [' ', '.', '-']: 
    if ch in text: 
     text = text.replace(ch,'_') 
+0

这是不正确,最快的方式是不是链接,也做'如果CH文本'是多余的,当你可以只'文本= text.replace(ch,'_')',如果没有任何东西可以替换,任何东西都不会被替换 –