Python,删除字符串中的所有非字母字符

我正在编写一个 Python MapReduce 字数计算程序。问题是,有很多非字母字符散落在数据,我发现这个后 Stripping everything but alphanumeric chars from a string in Python显示了一个很好的解决方案使用正则表达式,但我不知道如何实现它

def mapfn(k, v):
print v
import re, string
pattern = re.compile('[\W_]+')
v = pattern.match(v)
print v
for w in v.split():
yield w, 1

恐怕我不知道如何使用库 re或甚至正则表达式。我不确定如何将正则表达式模式应用到传入的字符串(一本书的行) v,以检索没有任何非字母数字字符的新行。

有什么建议吗?

263131 次浏览

使用 re.sub

import re


regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

或者,如果您只想删除一组特定的字符(输入中可以使用撇号...)

regex = re.compile('[,\.!?]') #etc.

可以使用 re.sub ()函数删除这些字符:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

Re.sub (匹配模式,替换字符串,字符串搜索)

  • "[^a-zA-Z]+"-查找任何一组不是 A-zA-z.
  • ""-将匹配的字符替换为“”

试试:

s = ''.join(filter(str.isalnum, s))

这将从字符串中获取每个字符,只保留字母数字字符,并从它们构建一个字符串。

如果不喜欢使用正则表达式,可以尝试使用

''.join([i for i in s if i.isalpha()])

最快的方法是 regex

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)


""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)


#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))


""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)


#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())


""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)




2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join

如果计划匹配特定的 Unicode 属性类,则建议使用 PyPi regex模块。此库还被证明更加稳定,特别是在处理大型文本时,并且在不同的 Python 版本之间产生一致的结果。你要做的就是及时更新。

如果您安装它(使用 pip install regexpip3 install regex) ,您可以使用

import regex
print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') )
// => ABCŁąćАбвdef

text中删除除 Unicode 字母以外的1个或多个字符的所有块。看 在线 Python 演示。您也可以使用 "".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))来获得相同的结果。

在 Pythonre中,为了匹配任何 Unicode 字母,可以使用 [^\W\d_]构造(匹配任何 Unicode 字母吗?)。

因此,要删除所有非字母字符,您可以匹配所有字母并加入结果:

result = "".join(re.findall(r'[^\W\d_]', text))

或者,删除所有符合 [\W\d_]模式的字符(与 [^\W\d_]相对) :

result = re.sub(r'[\W\d_]+', '', text)

看看 正则表达式在线演示。因为 Unicode 标准正在发展,并且与 \w匹配的字符集将取决于 Python 版本,所以在不同的 Python 版本之间可能会得到不一致的结果。强烈建议使用 PyPi regex库以获得一致的结果。