2013-02-28 214 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

相关问题