5

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

我的尝试:

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

6 回答 6

23

如果它需要在那个 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()])

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

于 2012-09-13T06:12:06.243 回答
8
import re
valids = re.sub(r"[^A-Za-z]+", '', my_string)

编辑:如果它需要是一个 for 循环,这样的事情应该可以工作:

output = ''
for character in input:
    if character.isalpha():
        output += character
于 2012-09-13T06:10:13.357 回答
3

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

import re

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

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

如果您想对数字序列进行操作,这就是循环的原因,请考虑将替换字符串参数替换为如下函数:

import re

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

def charFilter(myString)
    return re.sub('[^A-Z]+', '', myString, 0, re.I)
于 2012-09-13T06:07:37.567 回答
0

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

于 2012-09-13T06:11:09.067 回答
0

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

干得好:

def letters(input):
    valids = ""
    for character in input:
        if character.isalpha():
            valids += character
    return valids
于 2012-09-13T06:16:28.480 回答
0

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

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

set(x).intersection(y)

你可以像这样使用它:

from string import ascii_letters

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

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

于 2018-08-08T20:54:30.980 回答