Remove all special characters, punctuation and spaces from string
我需要从一个字符串中删除所有特殊字符、标点和空格,这样我只有字母和数字。
这可以在不使用
1 2 3 | >>> string ="Special $#! characters spaces 888323" >>> ''.join(e for e in string if e.isalnum()) 'Specialcharactersspaces888323' |
您可以使用
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来匹配一个不是字母或数字的字符串:
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
我认为只有
1 2 | In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.') Out[20]: 'stringwithspecialcharslikeetcs' |
Python 3
在python3中,
1 | ''.join(filter(str.isalnum, string)) |
或者在连接使用中通过
1 | ''.join([*filter(str.isalnum, string)]) |
注:在
看到这一点后,我很感兴趣通过找出执行时间最短的答案来扩展所提供的答案,因此我查看并对照两个示例字符串与
string1 = 'Special $#! characters spaces 888323' string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
例1
string1 —结果:10.7061979771string2 —结果:7.78372597694
例2
re.sub('[^A-Za-z0-9]+', '', string)
string1 —结果:7.10785102844string2 —结果:4.12814903259
例3
re.sub('\W+','', string)
string1 —结果:3.11899876595string2 —结果:2.78014397621
上述结果是平均值为:
示例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")) |