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

时间:2011-04-30 17:41:24

标签: python regex string

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

18 个答案:

答案 0 :(得分:276)

这可以在没有regex的情况下完成:

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

您可以使用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.

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

答案 1 :(得分:172)

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

[^A-Za-z0-9]+

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

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

答案 2 :(得分:39)

缩短方式:

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

如果您希望单词和数字之间的空格替换''用' '

答案 3 :(得分:19)

看到这个之后,我有兴趣通过查找在最短的时间内执行的答案来扩展所提供的答案,所以我通过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倍。

答案 4 :(得分:19)

Python 2。*

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

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

Python 3。*

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

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

或在联接使用中传递listnot sure but can be fast a bit

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

注意:[*args]中的解包已从Python >= 3.5

生效

答案 5 :(得分:15)

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

你可以添加更多特殊字符,并将被''取代。没有任何意义,即他们将被删除。

答案 6 :(得分:10)

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

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

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

import string

'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))

输出:

'This is A test'

答案 7 :(得分:8)

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

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

答案 8 :(得分:7)

假设您要使用正则表达式并且您需要/需要准备好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'
>>>

答案 9 :(得分: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' ')

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

答案 10 :(得分:5)

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

答案 11 :(得分:3)

使用翻译:

import string

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

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

答案 12 :(得分:2)

删除标点,数字和特殊字符

示例:-

enter image description here

代码

combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ") 

结果:- enter image description here

谢谢:)

答案 13 :(得分:2)

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

德语示例:

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

答案 14 :(得分:1)

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

你将看到你的结果为

“askhnlaskdjalsdk

答案 15 :(得分:1)

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

string = "Special $#! characters   spaces 888323"
''.join(e for e in string if (e.isalnum() or e.isspace()))
<块引用>

特殊字符空格888323

答案 16 :(得分:1)

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

<div x-data="{ show: false }">

    <input x-show="show" type="text" id="input" x-ref="input" />

    <button @click="show = !show; $refs.input.focus();">Button</button>

</div>

答案 17 :(得分:0)

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 

与双引号相同。“”“

# 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"))