从 Python3.3 中的字符串中删除除字母和空格之外的所有内容

Posted

技术标签:

【中文标题】从 Python3.3 中的字符串中删除除字母和空格之外的所有内容【英文标题】:Removing everything except letters and spaces from string in Python3.3 【发布时间】:2014-03-01 03:19:55 【问题描述】:

我有这个示例字符串:happy t00 go 129.129,我只想保留空格和字母。到目前为止,我所能想到的非常有效的方法是:

print(re.sub("\d", "", 'happy t00 go 129.129'.replace('.', '')))

但它只特定于我的示例字符串。如何删除除字母和空格以外的所有字符?

【问题讨论】:

所有答案均不包含 24 个字母,例如ß、Ä、Ö、Ü、Ą、Ż 等。也许问题应该只提及 ASCII 字母? 【参考方案1】:
whitelist = set('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ')
myStr = "happy t00 go 129.129$%^&*("
answer = ''.join(filter(whitelist.__contains__, myStr))

输出:

>>> answer
'happy t go '

【讨论】:

经过测试,当命令提示符中的每个代码作为python -m timeit -n 100 -s 循环运行时,我发现这比 Joel 的答案快 0.0029 微秒。 @Gronk:>>> Timer('"".join(filter(whitelist.__contains__, myStr))', ''' ... whitelist = set('abcdefghijklmnopqrstuvwxy ABCDEFGHIJKLMNOPQRSTUVWXYZ') ... myStr = 'happy t00 go 129.129' * 10''').timeit(number=1000) 0.02490997314453125 >>> Timer('re.sub(r"[^a-zA-Z ]+", "", myStr)', '''import re ... myStr = 'happy t00 go 129.129' * 10''').timeit(number=1000) 0.011039972305297852 >>> 。我的观点是 0.0029 微秒绝对在 100 样本大小的正常变化范围内。 这也会过滤可能有问题的重音字母字符。 缺少小写字母“z”【参考方案2】:

inspectorG4dget 的方法略有不同 - 从 string 导入 & 生成器理解:

from string import ascii_letters

allowed = set(ascii_letters + ' ')
myStr = 'happy t00 go 129.129'
answer = ''.join(l for l in myStr if l in allowed)
answer
# >>> 'happy t go '

性能对比:

(我把 myStr 加长了一点,并预编译了正则表达式,让事情变得更有趣)

import re
from string import ascii_letters, digits
myStr = 'happy t00 go 129.129'*20
allowed = set(ascii_letters + ' ')

# Generator
%timeit answer = ''.join(l for l in myStr if l in allowed)

# filter/__contains__
%timeit answer = ''.join(filter(allowed.__contains__, myStr))

# Regex
pat = re.compile(r'[^a-zA-Z ]+')
%timeit answer = re.sub(pat, '', myStr)

每个循环 53 µs ± 6.43 µs(7 次运行的平均值 ± 标准偏差,每次 10000 个循环) 每个循环 43.3 µs ± 7.48 µs(7 次运行的平均值 ± 标准偏差,每次 10000 个循环) 每个循环 26 µs ± 509 ns(7 次运行的平均值 ± 标准偏差,每次 10000 次循环)

【讨论】:

我发现这是最好的答案。它更具可读性,它展示了我们如何使用string constants 而不是手动输入它们,这很容易引发错误。【参考方案3】:

使用集合补码:

re.sub(r'[^a-zA-Z ]+', '', 'happy t00 go 129.129')

【讨论】:

以上是关于从 Python3.3 中的字符串中删除除字母和空格之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

EXCEL函数去除数组中的0值和空值

用于从字符串中删除除“a”和“i”之外的所有单个字母的 Java 正则表达式 [关闭]

如何用C语言将字符串中除字母的其他符号删除

有没有办法删除Python中字符串中除字母之外的所有字符?

Leetcode(周赛):移除字母异位词5234,最大连续楼层数6064