我调用一个函数,返回包含各种字符的代码,范围从(到",和,和数字。
有没有一种优雅的方法来删除所有这些,所以我最终只得到字母?
答案 0 :(得分:9)
鉴于
s = '@#24A-09=wes()&8973o**_##me' # contains letters 'Awesome'
您可以使用生成器表达式过滤掉非字母字符:
result = ''.join(c for c in s if c.isalpha())
或使用filter
过滤:
result = ''.join(filter(str.isalpha, s))
或者您可以使用re.sub
import re
result = re.sub(r'[^A-Za-z]', '', s)
答案 1 :(得分:3)
使用RegExes的解决方案非常简单:
import re
newstring = re.replace(r"[^a-zA-Z]+", "", string)
string
是您的字符串,而newstring
是没有字母的字符串。这样做是用空字符串替换不是字母的每个字符,从而将其删除。但请注意,RegEx在这里可能略显过分。
更具功能性的方法是:
newstring = "".join(filter(str.isalpha, string))
不幸的是,您不能只在str
对象上调用filter
将其转换为字符串,这看起来会更好......
它将采用pythonic方式
newstring = "".join(c for c in string if c.isalpha())
答案 2 :(得分:2)
你没有提到你只想要英语字母,这是一个国际解决方案:
import unicodedata
str = u"hello, ѱϘяԼϷ!"
print ''.join(c for c in str if unicodedata.category(c).startswith('L'))
答案 3 :(得分:1)
>>> import re
>>> string = "';''';;';1123123!@#!@#!#!$!sd sds2312313~~\"~s__"
>>> re.sub("[\W\d_]", "", string)
'sdsdss'
答案 4 :(得分:0)
这是另一个,使用string.ascii_letters
>>> import string
>>> "".join(x for x in s if x in string.ascii_letters)
`
答案 5 :(得分:0)
s = '@#24A-09=wes()&8973o**_##me'
print(filter(str.isalpha, s))
# Awesome
关于filter
的返回值:
filter(function or None, sequence) -> list, tuple, or string
答案 6 :(得分:0)
嗯,我在这种情况下自己用这个
对不起,如果它已经过时了:)
string = "The quick brown fox jumps over the lazy dog!"
alphabet = "abcdefghijklmnopqrstuvwxyz"
def letters_only(source):
result = ""
for i in source.lower():
if i in alphabet:
result += i
return result
print(letters_only(string))