从string中删除所有特殊字符,标点符号和空格

我需要从string中删除所有特殊字符,标点符号和空格,以便我只有字母和数字。

这可以做到没有regex

 >>> string = "Special $#! characters spaces 888323" >>> ''.join(e for e in string if e.isalnum()) 'Specialcharactersspaces888323' 

你可以使用str.isalnum

 S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise. 

如果你坚持使用regex ,其他解决scheme将会很好。 但是请注意,如果不使用正则expression式就可以完成,那么这是最好的方法。

这是一个正则expression式来匹配不是字母或数字的string:

 [^A-Za-z0-9]+ 

这里是执行正则expression式replace的Python命令:

 re.sub('[^A-Za-z0-9]+', '', mystring) 

较短的方法:

 import re cleanString = re.sub('\W+','', string ) 

如果你想在单词和数字之间的空格replace''与''

 #!/usr/bin/python import re strs = "how much for the maple syrup? $20.99? That's ricidulous!!!" print strs nstr = re.sub(r'[?|$|.|!]',r'',strs) print nstr nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr) print nestr 

你可以添加更多的特殊字符,这将被replace为''意味着什么,即他们将被删除。

我认为只是filter(str.isalnum, string)作品

 In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.') Out[20]: 'stringwithspecialcharslikeetcs' 

看到这个之后,我有兴趣通过找出哪一个执行时间最less来扩展提供的答案,所以我用时间对两个示例string进行了检查:

  • string1 = 'Special $#! characters spaces 888323'
  • string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'

例1

'.join(e for e in string if e.isalnum())

  • string1 – 结果:10.7061979771
  • string2 – 结果:7.78372597694

例2

import re re.sub('[^A-Za-z0-9]+', '', string)

  • string1 – 结果:7.10785102844
  • string2 – 结果:4.12814903259

例3

import re re.sub('\W+','', string)

  • string1 – 结果:3.11899876595
  • string2 – 结果:2.78014397621

以上结果是平均回归结果最低的产物: repeat(3, 2000000)

示例3可以比示例13倍。

最通用的方法是使用分类每个单一字符的unicodedata表的“类别”。 例如,以下代码根据其类别筛选仅可打印的字符:

 import unicodedata # strip of crap characters (based on the Unicode database # categorization: # http://www.sql-und-xml.de/unicode-database/#kategorien PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs')) def filter_non_printable(s): result = [] ws_last = False for c in s: c = unicodedata.category(c) in PRINTABLE and c or u'#' result.append(c) return u''.join(result).replace(u'#', u' ') 

查看上面给出的所有相关类别的URL。 你当然也可以通过标点符号来筛选。

假设你想要使用正则expression式,并且你需要/需要Unicode-cognizant 2.x代码是2to3就绪:

 >>> import re >>> rx = re.compile(u'[\W_]+', re.UNICODE) >>> data = u''.join(unichr(i) for i in range(256)) >>> rx.sub(u'', data) u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff' >>> 

使用翻译:

 import string def clean(instr): return instr.translate(None, string.punctuation + ' ') 

注意:只适用于ASCIIstring。

 import re abc = "askhnl#$%askdjalsdk" ddd = abc.replace("#$%","") print (ddd) 

你会看到你的结果

“askhnlaskdjalsdk