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

use*_*546 208 python regex string

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

use*_*312 310

这可以不用str.isalnum:

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Run Code Online (Sandbox Code Playgroud)

你可以使用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.
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用str.isalnum,其他解决方案将会很好.但请注意,如果可以在不使用正则表达式的情况下完成,那么这是最好的方法.

  • @DiegoNavarro除了那不是真的,我对`isalnum()`和regex版本进行了基准测试,正则表达式的速度提高了50-75% (9认同)
  • 不使用正则表达式作为经验法则的原因是什么? (6认同)
  • 另外:"对于8位字符串,此方法依赖于语言环境."!因此正则表达式替代方案严格更好! (2认同)

And*_*ite 194

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

[^A-Za-z0-9]+
Run Code Online (Sandbox Code Playgroud)

以下是执行正则表达式替换的Python命令:

re.sub('[^A-Za-z0-9]+', '', mystring)
Run Code Online (Sandbox Code Playgroud)

  • 这硬编码了字母和数字的ASCII定义. (13认同)
  • +1保持简单愚蠢!这比非正则表达式解决方案更短,更容易阅读,也可能更快.(但是,我会添加一个`+`量词来提高它的效率.) (7认同)
  • @Reihan_amn只需在正则表达式中添加一个空格,它就变成:`[^ A-Za-z0-9] +` (5认同)
  • 这不适用于西班牙语、德语、丹麦语和其他语言。 (4认同)
  • 只需添加该特定语言的特殊字符即可。例如,要用于德语文本,可以使用 re.sub('[^A-Za-z0-9 ,.-_\'äöüäÖÜß]+', '', sample_text) 表达式。 (3认同)
  • 这也删除了单词之间的空格,“伟大的地方”->“伟大的地方”。如何避免? (2认同)
  • 我想这不适用于其他语言中的修改字符,例如******,******,****等.我是对的吗?如果是这样,它的正则表达式怎么样? (2认同)

bas*_*sta 41

更短的方式:

import re
cleanString = re.sub('\W+','', string )
Run Code Online (Sandbox Code Playgroud)

如果你想要单词和数字之间的空格替换''with''

  • 除了_在\ w中,并且在这个问题的上下文中是一个特殊字符. (3认同)
  • `r'\W+'` - 稍微偏离主题(并且非常迂腐),但我建议养成一种习惯,即所有正则表达式模式都是 [原始字符串](/sf/answers/968532001/) (2认同)
  • 此过程不会将下划线 (_) 视为特殊字符。 (2认同)
  • 一个简单的更改也可以删除 `_`:`r"[^A-Za-z]+"` 而不是 `r"\W+"` (2认同)

mbe*_*com 27

在看到这个之后,我有兴趣通过查找在最短的时间内执行哪些来扩展所​​提供的答案,所以我通过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可以比实施例13倍.


Gri*_*han 20

Python 2.*

我认为只是filter(str.isalnum, string)有效

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Run Code Online (Sandbox Code Playgroud)

Python 3.*

在Python3中,filter( )函数将返回一个可迭代的对象(而不是上面的字符串).必须加入以从itertable获取字符串:

''.join(filter(str.isalnum, string)) 
Run Code Online (Sandbox Code Playgroud)

或传递list加入使用(不确定,但可以快一点)

''.join([*filter(str.isalnum, string)])
Run Code Online (Sandbox Code Playgroud)

  • @Alexey正确,在python3`map`中,`filter`和`reduce`代替返回itertable对象.仍然在Python3 +中我更喜欢`''.join(filter(str.isalnum,string))`(或者在连接中传递列表使用`''.join([*filter(str.isalnum,string)])`)过度接受的答案. (4认同)

pkm*_*pkm 16

#!/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
Run Code Online (Sandbox Code Playgroud)

你可以添加更多特殊字符,这将被替换为''意味着什么,即它们将被删除.


Vla*_*den 15

string.punctuation 包含以下字符:

'!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'

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

import string

'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Run Code Online (Sandbox Code Playgroud)

输出:

'This is A test'
Run Code Online (Sandbox Code Playgroud)


And*_*rea 14

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

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

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
Run Code Online (Sandbox Code Playgroud)

这意味着“用空字符串替换每个不是数字的字符,或用'a到z'或'A到Z'范围内的字符”。

实际上,如果^在正则表达式的第一位插入特殊字符,则会得到否定。

额外提示:如果您还需要将结果小写,则可以使正则表达式更快,更轻松,只要您现在找不到大写即可。

import re
s = re.sub(r"[^a-z0-9]","",s.lower())
Run Code Online (Sandbox Code Playgroud)


Joh*_*hin 8

假设您想要使用正则表达式,并且您需要/需要准备好2to3的Unicode识别2.x代码:

>>> 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'
>>>
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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' ')
Run Code Online (Sandbox Code Playgroud)

查看上面给定的URL以了解所有相关类别.您当然也可以按标点类别进行过滤.


小智 5

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


pet*_*ich 5

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

\n

德语示例:

\n
re.sub('[^A-Z\xc3\x9c\xc3\x96\xc3\x84a-z0-9]+', '', mystring)\n
Run Code Online (Sandbox Code Playgroud)\n


小智 5

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

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)
Run Code Online (Sandbox Code Playgroud)