从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可以比示例1快3倍。
最通用的方法是使用分类每个单一字符的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