如何过滤字符串只包含字母?

时间:2012-09-13 06:03:01

标签: python

如何创建一个函数,它会过滤掉字符串中的所有非字母?例如,letters("jajk24me")将返回"jajkme"。 (它需要是for循环)并且string.isalpha()函数会帮助我吗?

我的尝试:

def letters(input):
    valids = []
    for character in input:
        if character in letters:
            valids.append( character)
    return (valids)

6 个答案:

答案 0 :(得分:16)

如果它需要在for循环中,并且正则表达式不会这样做,那么循环的这个小修改将起作用:

def letters(input):
    valids = []
    for character in input:
        if character.isalpha():
            valids.append(character)
    return ''.join(valids)

(最后的''.join(valids)获取您在列表中收集的所有字符,并将它们连接成一个字符串。原始函数返回该字符列表)

您还可以过滤掉字符串中的字符:

def letters(input):
    return ''.join(filter(str.isalpha, input))

或列表理解:

def letters(input):
    return ''.join([c for c in input if c.isalpha()])

或者您可以使用正则表达式,正如其他人所建议的那样。

答案 1 :(得分:7)

import re
valids = re.sub(r"[^A-Za-z]+", '', my_string)

编辑:如果它需要是for循环,那么这样的东西应该有效:

output = ''
for character in input:
    if character.isalpha():
        output += character

答案 2 :(得分:1)

请参阅re.sub,性能考虑re.compile优化模式一次 下面是一个简短的版本,它匹配的所有字符都不在AZ的范围内,并用空字符串替换它们。 re.I标志忽略大小写,因此也会替换小写(a-z)字符。

import re

def charFilter(myString)
    return re.sub('^[A-Z]*', '', myString, 0, re.I)

如果你真的需要这个循环,那么就有很多知识分子,具体解释一下。但是,您可能想要说明需要循环的原因。

如果你想对数字序列进行操作,那么循环的原因考虑用以下函数替换替换字符串参数:

import re

def numberPrinter(matchString) {
     print(matchString)
     return ''
}

def charFilter(myString)
    return re.sub('^[A-Z]*', '', myString, 0, re.I)

答案 3 :(得分:0)

方法string.isalpha()检查字符串是否仅由字母字符组成。您可以使用它来检查是否需要进行任何修改。 至于问题的其他部分,pst恰到好处。您可以在python doc中了解正则表达式:http://docs.python.org/library/re.html 它们可能看起来令人生畏,但一旦掌握它们就非常有用。

答案 4 :(得分:0)

当然你可以使用isalpha。此外,valids可以是字符串。

你走了:

def letters(input):
    valids = ""
    for character in input:
        if character.isalpha():
            valids += character
    return valids

答案 5 :(得分:0)

不使用for循环。但这已被彻底覆盖。

可能会晚一点,我不确定性能,但是我只是想到了这个解决方案,它看起来很漂亮:

set(x).intersection(y)

您可以像这样使用它:

from string import ascii_letters

def letters(string):
    return ''.join(set(string).intersection(ascii_letters))

注意: 这将不会保留线性顺序。在我的用例中,这很好,但要警告