如何在python中替换字符串中的非字母和数字字符

时间:2014-08-05 13:51:35

标签: python regex string

据我所知,要替换字符串中的非字母数字字符,代码如下:

words = re.sub("[^\w]", " ",  str).split()

但是,^\w会替换非字母数字字符。我想在字符串中替换非字母和数字字符,如:

"baa!!!!! baa sheep23? baa baa"

我希望它有这样的结果:

 "baa baa sheep baa baa"

如果我words = re.sub("[^\w\d]", " ", str).split(),我会得到一个数字字符的结果,例如'sheep23'。我想这可能是因为"^"也会影响\d,并且计算好像我希望删除非数字字符。我该怎么做?

6 个答案:

答案 0 :(得分:8)

使用str.translate

>>> from string import punctuation, digits
>>> s = "baa!!!!! baa sheep23? baa baa"
>>> s.translate(None, punctuation+digits)
'baa baa sheep baa baa'

答案 1 :(得分:3)

这里不需要正则表达式,只需简单的理解即可:

>>> import string
>>> word = "baa!!!!! baa sheep23? baa baa"
>>> "".join([l for l in word if l in string.ascii_letters+string.whitespace])
'baa baa sheep baa baa'

答案 2 :(得分:2)

试试这个正则表达式:

[^a-zA-Z]

这匹配任何非字母的内容。

或者如果你想保留空格:

[^ A-ZA-Z \ S]

答案 3 :(得分:1)

这个正则表达式怎么样?

[^\w]|\d

编辑:

正如@Avinash所说,这不会删除_。如果您还要删除_,请使用:

[^\w]|[\d_]

如果您还想用一个空格替换多个空格:

([^\w]|[\d_])+

以下是添加下划线的示例:

In [1]: import re

In [2]: s = "baa!!!!! baa sheep23? baa baa___"

In [3]: re.sub("([^\w]|[\d_])+", " ",  s)
Out[3]: 'baa baa sheep baa baa '

In [4]: re.sub("([^\w]|[\d_])+", " ",  s).split()
Out[4]: ['baa', 'baa', 'sheep', 'baa', 'baa']

答案 4 :(得分:0)

通过re.sub功能,

>>> s = "baa!!!!! baa sheep23? baa baa"
>>> m = re.sub(r'[^A-Za-z ]', "", s)
>>> m
'baa baa sheep baa baa'

答案 5 :(得分:0)

不是用空格替换每个非字母,而是拆分,而不是一次性完成所有操作:

>>> re.split("[^a-zA-Z]+", "baa!!!!! baa sheep23? baa baa")
['baa', 'baa', 'sheep', 'baa', 'baa']

[^\w]相当于[^a-zA-Z0-9_](模数语言设置),您只需要在角色类中保留您想要的内容 - [^a-zA-Z]显然包含空格。