关于python:从字符串中删除所有特殊字符,标点符号和空格

Remove all special characters, punctuation and spaces from string

我需要从一个字符串中删除所有特殊字符、标点和空格,这样我只有字母和数字。


这可以在不使用regex的情况下完成:

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

您可以使用str.isalnum

1
2
3
4
S.isalnum() -> bool

Return True if all characters in S are alphanumeric
and there is at least one character in S, False otherwise.

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


这里有一个regex来匹配一个不是字母或数字的字符串:

1
[^A-Za-z0-9]+

下面是执行regex替换的python命令:

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


更短的方式:

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

如果要在单词和数字之间使用空格,请将""替换为""。


Python 2

我认为只有filter(str.isalnum, string)起作用

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

Python 3

在python3中,filter( )函数将返回一个itertable对象(与上面不同,它不是字符串)。必须重新连接才能从itertable获取字符串:

1
''.join(filter(str.isalnum, string))

或者在连接使用中通过list(不确定,但可以快一点)

1
''.join([*filter(str.isalnum, string)])

注:在[*args]中解包从python生效>=3.5


看到这一点后,我很感兴趣通过找出执行时间最短的答案来扩展所提供的答案,因此我查看并对照两个示例字符串与timeit核对了一些建议的答案:

  • 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倍。


1
2
3
4
5
6
7
8
9
#!/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

您可以添加更特殊的字符,将被""替换的字符表示没有任何内容,即它们将被删除。


与其他所有使用regex的人不同,我会尝试排除所有我不想要的字符,而不是显式地枚举我不想要的字符。

例如,如果我只需要"a到z"(大写和小写)和数字之间的字符,我将排除其他所有内容:

1
2
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

这意味着"用空字符串替换所有不是数字的字符,或"a到z"或"a到z"范围内的字符"。

实际上,如果在regex的第一个位置插入特殊字符^,就会得到否定。

额外提示:如果您还需要将结果小写,您可以使regex更快更容易,只要您现在找不到任何大写字母。

1
2
import re
s = re.sub(r"[^a-z0-9]","",s.lower())

假设您想要使用regex,并且您想要/需要unicode认知2.x代码,它是2to3就绪的:

1
2
3
4
5
6
>>> 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'
>>>

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

最通用的方法是使用unicodedata表的"categories",它对每个字符进行分类。例如,以下代码仅根据可打印字符的类别筛选可打印字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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。当然你也可以过滤按标点分类。


使用翻译:

1
2
3
4
import string

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

警告:仅适用于ASCII字符串。


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

你将看到你的结果

'askhnlaskdjalsdk'


1
2
import re
my_string ="""Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the

与双引号相同。"

1
2
3
4
5
6
7
8
# if we need to count the word python that ends with or without ',' or '.' at end

count = 0
for i in text:
    if i.endswith("."):
        text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
    count += 1
print("The count of Python :", text.count("python"))