Python 从字符串中删除所有特殊字符、标点符号和空格

Python 从字符串中删除所有特殊字符、标点符号和空格,python,regex,string,Python,Regex,String,我需要删除字符串中的所有特殊字符、标点符号和空格,这样我就只有字母和数字了。这里有一个正则表达式,用于匹配非字母或数字的字符串: [^A-Za-z0-9]+ 下面是执行正则表达式替换的Python命令: re.sub('[^A-Za-z0-9]+', '', mystring) 这可以在没有正则表达式的情况下完成: >>> string = "Special $#! characters spaces 888323" >>> ''.join(e for

我需要删除字符串中的所有特殊字符、标点符号和空格,这样我就只有字母和数字了。

这里有一个正则表达式,用于匹配非字母或数字的字符串:

[^A-Za-z0-9]+
下面是执行正则表达式替换的Python命令:

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

这可以在没有正则表达式的情况下完成:

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
您可以使用:


如果您坚持使用regex,其他解决方案也可以。但是请注意,如果不使用正则表达式就可以完成,那么这是最好的方法。

最通用的方法是使用unicodedata表中的“categories”对每个字符进行分类。例如,以下代码仅根据其类别过滤可打印字符:

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。当然你也可以过滤
根据标点符号类别。

假设您想要使用正则表达式,并且您想要/需要Unicode cognisant 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 re
cleanString = re.sub('\W+','', string )
如果需要单词和数字之间的空格,请将“”替换为“”

你会看到你的结果

'askhnlaskdjalsdk

使用翻译:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')
警告:仅适用于ascii字符串。

Python 2* 我认为只要
过滤器(str.isalnum,string)
就行了

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Python 3* 在Python3中,
filter()
函数将返回一个itertable对象(而不是像上面那样的字符串)。要从itertable中获取字符串,必须返回:

''.join(filter(str.isalnum, string)) 
或通过加入使用中的
列表
()


注意:在
[*args]
中解包有效期从看到这一点后,我很想通过找出哪一个在最短时间内执行来扩展提供的答案,因此我查看了一些建议的答案,并对照两个示例字符串进行了检查:

  • string1='Special$#!字符空格888323'
  • string2='枫糖浆多少钱$20.99? 那太无聊了!!!'
例1
”.join(如果e.isalnum(),则e代表字符串中的e)

  • string1
    -结果:10.70619771
  • string2
    -结果:7.78372597694
例2
重新导入
re.sub(“[^A-Za-z0-9]+”,“,字符串)

  • string1
    -结果:7.10785102844
  • string2
    -结果:4.12814903259
例3
重新导入
re.sub('\W+','',字符串)

  • string1
    -结果:3.11899876595
  • string2
    -结果:2.7801497621
上述结果是平均值为:
repeat(320000)

示例3比示例1快3倍

s=re.sub(r“[-()\”\35;/@;:{}`+=~!?,],“,”,s)
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
与双引号相同


与其他使用正则表达式的人不同,我会尝试排除所有不是我想要的字符,而不是明确列举我不想要的

例如,如果我只需要从“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())

字符串。标点符号包含以下字符:

"!!“#$%&\'()*+,-./:;?@[\]^{124;}”

可以使用translate和maketrans函数将标点映射为空值(替换)

输出:

'This is A test'

对于包含特殊字符的其他语言,如德语、西班牙语、丹麦语、法语等(如德语“Umlaute”如
u
a
ö
),只需将这些字符添加到正则表达式搜索字符串中:

以德语为例:

re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)

这将删除除空格以外的所有非字母数字字符

string = "Special $#! characters   spaces 888323"
''.join(e for e in string if (e.isalnum() or e.isspace()))
特殊字符空间888323


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

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)

KISS:保持简单愚蠢!这比非正则表达式的解决方案更短、更容易阅读,而且可能更快。(不过,我会添加一个
+
量词来提高它的效率。)这也会删除单词“great place”->“greatplace”之间的空格“。如何避免它?@Reihan_amn只需在正则表达式中添加一个空格,它就变成:
[^a-Za-z0-9]+
我想这对其他语言中的修改字符不起作用,比如á、ö、ñ等。我说的对吗?”?如果是这样,它的正则表达式会是什么?这不适用于西班牙语、德语、丹麦语和其他语言。每行末尾的
$
是什么意思?如果是复制和粘贴问题,那么你应该修复它吗?不使用regex作为经验法则的原因是什么?@ChrisDutrow regex比内置的python字符串慢functions@DiegoNavarro除此之外,我对
isalnum()
和regex版本进行了基准测试,在Python3中,regex one的速度快了50-75%——它接受unicode字符,所以对我来说毫无用处。以string=“B223323\§§§$3\u445454”为例。结果如何?”B2233233䑔54'此外:“对于8位字符串,此方法依赖于语言环境。”!因此,regex替代方案绝对更好!版本差异?我得到
TypeError:translate()只接受py3.4的一个参数(给定2个)
,它只适用于Python2.7。请参阅使用Python3的
translate
。@kkurian如果您阅读了我答案的开头,这只是一个比较
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
import string

'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
'This is A test'
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)
string = "Special $#! characters   spaces 888323"
''.join(e for e in string if (e.isalnum() or e.isspace()))
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)