我需要将一个字符串中的所有特殊字符、标点符号和空格都去除,这样我就只剩下字母和数字了。
这可以在不使用正则表达式的情况下完成:
>>> 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.
如果您坚持使用正则表达式,其他解决方案也可以胜任。但请注意,如果不使用正则表达式也可以完成任务,那就是最好的方法。
这是一个正则表达式,用于匹配不是字母或数字的字符:
[^A-Za-z0-9]+
这里是用Python进行正则表达式替换的命令:
re.sub('[^A-Za-z0-9]+', '', mystring)
[^A-Za-z0-9 ]+
。 - sougonde更简洁的方法:
import re
cleanString = re.sub('\W+','', string )
如果你想在单词和数字之间加上空格,请将''替换为' '
r"[^A-Za-z]+"
代替r"\W+"
。 - Tomerikoo我计时了提供的答案。
import re
re.sub('\W+','', string)
相对于提供的其他最快答案,通常会快3倍
使用此选项时应注意。某些特殊字符(例如ø)可能无法使用此方法剥离。
看到这个,我对提供的答案进行了扩展,找出哪个执行时间最短,因此我检查了一些提议的答案,并使用timeit
针对两个示例字符串:
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ridiculous!!!'
'.join(e for e in string if e.isalnum())
string1
- 结果:10.7061979771string2
- 结果:7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- 结果:7.10785102844string2
- 结果:4.12814903259import re
re.sub('\W+','', string)
string1
- 结果:3.11899876595string2
- 结果:2.78014397621上述结果是通过对repeat(3, 2000000)
的平均值返回最低结果得出的。
示例3可以比示例1快3倍。
我认为只需要使用filter(str.isalnum, string)
即可。
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
在Python3中,filter()
函数会返回一个可迭代对象(与上文不同,它不返回字符串)。必须使用join方法将其转换为字符串:
''.join(filter(str.isalnum, string))
或者在join中传递list
时使用(不确定但可能会快一些)
''.join([*filter(str.isalnum, string)])
注意:在Python >= 3.5中,[*args]
表示解包参数的语法是有效的。
map
、filter
和 reduce
返回迭代对象。在Python3+中,我仍然更喜欢使用 ''.join(filter(str.isalnum, string))
(或者如果要将列表传递给 join,则使用 ''.join([*filter(str.isalnum, string)])
)而不是接受的答案。 - Grijesh Chauhan''.join(filter(str.isalnum, string))
相对于filter(str.isalnum, string)
来说是否更好,至少在阅读上是这样的。这真的是Pythonic(是的,你可以用这个词)的做法吗? - TheProletariatfilter(str.isalnum, string)
*不能像Python2一样返回字符串,因为Python3中的filter()
返回迭代器而不是参数类型。 - Grijesh Chauhan#!/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
您可以添加更多的特殊字符,这些字符将被替换为''表示没有意义,即它们将被删除。
string.punctuation包含以下字符:
'!"#$%&\'()*+,-。/:;< =>?@[\\]^_`{|}~'
您可以使用translate和maketrans函数将标点符号映射为空值(替换)。
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
输出:
'This is A test'
与其他人使用正则表达式的方式不同,我会尝试排除每个不是我想要的字符,而不是明确列举我不想要的内容。
例如,如果我只想要从'a到z'(大写和小写)以及数字的字符,我会排除所有其他字符:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
这意味着“用空字符串替换掉不是数字、在'a到z'或'A到Z'范围内的字符”。事实上,如果你在正则表达式的第一位插入特殊字符^
,你会得到否定结果。额外的提示:如果你还需要将结果转换为小写,只要现在找不到任何大写字母,你就可以使正则表达式变得更快、更容易。import re
s = re.sub(r"[^a-z0-9]","",s.lower())
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
>>> 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'
>>>
isalnum()
和正则表达式版本进行了基准测试,而且正则表达式版本更快,速度提高了50-75%。 - Francisco