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


当前回答

#!/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

你可以添加更多的特殊字符,这将被“意味着什么,即他们将被删除”所取代。

其他回答

TLDR

我计算了提供的答案。

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

通常比上一个最快的答案快3倍。

使用此选项时应谨慎。一些特殊字符(如ø)不能使用这种方法进行条纹。


在看到这个之后,我有兴趣通过找出在最少的时间内执行的答案来扩展提供的答案,所以我通过timeit检查了一些建议的答案,并对照两个示例字符串:

string1 = '特殊$#!字符空格888323' '枫糖浆多少钱? '20.99美元吗?这太荒谬了!!”

示例1

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

string1 - Result: 10.7061979771 string2 - Result: 7.78372597694

示例2

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

string1 - Result: 7.10785102844 string2 - Result: 4.12814903259

示例3

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

string1 - Result: 3.11899876595 string2 - Result: 2.78014397621

以上结果是由以下平均值的最低返回结果的乘积:重复(3,2000000)

例3可以比例1快3倍。

假设你想要使用正则表达式并且你想要/需要unicode - cognant 2。X代码是2to3-ready:

>>> 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 re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

你会看到你的结果是

'Askhnlaskdjalsdk

s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)

这将删除字符串中的所有特殊字符、标点符号和空格,只包含数字和字母。

import re

sample_str = "Hel&&lo %% Wo$#rl@d"

# using isalnum()
print("".join(k for k in sample_str if k.isalnum()))


# using regex
op2 = re.sub("[^A-Za-z]", "", sample_str)
print(f"op2 = ", op2)


special_char_list = ["$", "@", "#", "&", "%"]

# using list comprehension
op1 = "".join([k for k in sample_str if k not in special_char_list])
print(f"op1 = ", op1)


# using lambda function
op3 = "".join(filter(lambda x: x not in special_char_list, sample_str))
print(f"op3 = ", op3)