2013-02-28 172 views
0

我通過csv.reader()讀一個CSV文件,我想從每一種符號或空格和小寫像閱讀自由的價值觀:如何從字符串中刪除所有符號和空格?

a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . " 

將「一」是這樣的:

a = "kingstonusb1gb2gb32gb" 

我只想在我的數據中使用字母和數字。
任何類型的符號都應該刪除。
我已經使用.lower()函數和.strip()函數來做到這一點。但strip函數只是刪除單詞之間的空格,而我想刪除各種符號。
謝謝。

回答

3

您可以使用正則表達式:

>>> import re 
>>> a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . " 
>>> re.sub(r'[^a-z0-9]', '', a.lower()) 
'kingstonusb1gb2gb32gb' 

或發電機:

>>> import string 
>>> allowed = string.lowercase + string.digits 
>>> ''.join(c for c in a.lower() if c in allowed) 
'kingstonusb1gb2gb32gb' 

還是什麼快:

>>> import string 
>>> allowed = set(string.lowercase + string.digits) 
>>> ''.join(filter(allowed.__contains__, a.lower())) 
'kingstonusb1gb2gb32gb' 
+0

我擊敗了你的發電機 - 我的操作在O(N)而不是O(N^2);-) – mgilson 2013-02-28 05:44:14

+0

@mgilson:當它。好吧,看我的編輯。 – Blender 2013-02-28 05:44:56

+0

:) - 是啊是啊... +1 – mgilson 2013-02-28 05:45:32

2

我可能會做這樣的事情:

import string 
good = set(string.ascii_lowercase + string.digits) 
a = ''.join(x for x in a.lower() if x in good) 

它可能不是最有效的,但它應該工作,這是很容易閱讀/理解。

+0

+1'ascii_lowercase'和'string.lowercase'之間是否有區別? – Blender 2013-02-28 05:48:46

+0

@Blender - 'ascii_lowercase'不依賴於語言環境。 – mgilson 2013-02-28 05:52:24

3

如果使用ASCII,您可以使用str.translate從您的小寫字符串中刪除所有無數字和字母的字符串

>>> from string import ascii_letters, digits 
>>> ascii = set(chr(e) for e in range(128)) 
>>> ascii_sans_alpha = ''.join(ascii.difference(ascii_letters + digits)) 
>>> a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . " 
>>> a.lower().translate(None,ascii_sans_alpha) 
'kingstonusb1gb2gb32gb' 

這個速度有多快?使用timeit參考

>>> def mgilson(a, good = set(string.ascii_lowercase + string.digits)): 
    return ''.join(x for x in a.lower() if x in good) 

>>> def blender_re(a): 
    return re.sub(r'[^a-z0-9]', '', a.lower()) 

>>> def blender_gen(a, allowed = string.lowercase + string.digits): 
    return ''.join(c for c in a.lower() if c in allowed) 

>>> def blender_fast(a, allowed = set(string.lowercase + string.digits)): 
    return ''.join(filter(allowed.__contains__, a.lower())) 

>>> def abhijit(a, ascii_sans_alpha = ''.join(set(chr(e) for e in range(128)).difference(ascii_letters + digits))): 
    return a.lower().translate(None,ascii_sans_alpha) 

>>> time_dict = {"abhijit": "from __main__ import string, a", 
      "blender_re":"from __main__ import re, a, abhijit", 
      "blender_gen": "from __main__ import string, a", 
      "blender_fast": "from __main__ import string, a", 
      "mgilson": "from __main__ import string, a"} 
>>> for k, v in time_dict.items(): 
    t = timeit.Timer(stmt="{}(a)".format(k),setup = "{},{}".format(v,k)) 
    print "Timing for {} is {}".format(k, t.timeit(100000)) 


Timing for blender_fast is 0.573348026237 
Timing for blender_re is 0.632169556846 
Timing for blender_gen is 0.720916486331 
Timing for mgilson is 0.586592185393 
Timing for abhijit is 0.203489867547 
>>> 
+0

但我的手柄unicode'abhijit(u'señor')'; – Blender 2013-02-28 06:18:43

+0

我想過'translate' ..但它似乎很亂,所以我沒有打擾。我很高興你做到了。 – mgilson 2013-02-28 16:54:02

相關問題