2016-08-19 99 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,'_')',如果沒有任何東西可以替換,任何東西都不會被替換 –