在字符串中查找字母

时间:2015-05-17 08:24:16

标签: python python-3.x findall

我试图编写一个代码,用于查找包含特殊字符,数字和字母的字符串中的字母。以下代码不返回任何内容:

a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)
final = a.split()
for y in final:
    if (y.isalpha == True):
        print(y)

输出:& &)& gokjhohgouigougyy ^& * ^ x =>无

有人可以告诉我这是什么问题,如何在不使用re.findall的情况下执行此操作,例如:使用循环如:

for(y in final):
    if (ord(y) in range (97, 127)):
        print(y)

以上代码有效:

for y in a:
    if (ord(y) in range (97, 127)):
        print(y, end='')

6 个答案:

答案 0 :(得分:3)

您需要将y.isalpha称为y.isalpha()这是因为isalpha是一种功能或方法。

>>> y='y'
>>> y.isalpha
<built-in method isalpha of str object at 0x00FA3A40>
>>> y.isalpha()
True

请注意,您的拆分将为您提供单词而不是字母 - 这可能不是您所期望的:

>>> s = "Yes! These are words."
>>> for w in s.split(' '):
...    print(w, w.isalpha())
...
Yes! False
These True
are True
words. False
>>>

在python中习惯的一件事是属性和方法之间的区别 - 属性是你可以读取方法执行某些操作的东西 - dir列出了字符串{{ 1}}你有:

s

其中:

>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__',
 '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', 
 '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
 '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 
 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum',
 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 
 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',
 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind',
 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'
]

是一个属性,并且:

>>> s.__class__
<class 'str'>

是一种方法,需要通过添加括号()来实际执行其功能。值得区分返回值的方法和操作的方法。

>>> s.capitalize
<built-in method capitalize of str object at 0x03529F50>

返回一个值>>> s.lower() 'yes! these are words.' ,但s.split()是就地操作,例如:

sort

答案 1 :(得分:2)

拆分字符串会返回一个子字符串列表。例如:&#34; abc def ghi&#34; .split(&#34;&#34;)返回[&#34; abc&#34;,&#34; def&#34;,&#34; ghi& #34]。 你不需要为你正在尝试的东西拆分字符串。只需循环遍历字符串本身。

string = "&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
for char in string:
    if char.isalpha():
        print(char)

答案 2 :(得分:1)

您不需要将其拆分,而应将isalpha称为isalpha(),因为它们是不同的东西。这应该打印我所假设的所有字母。

a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)

for y in a:
    if y.isalpha():
        print(y)

答案 3 :(得分:1)

从您的代码中看起来更像是要从字符串中删除不需要的字符,而不是找到要保留的字符。

所以,如果你想打印结果:

join()

输出:

g
o
k
...
y
y
x

但通常你会想要将过滤后的字符串分配给一个变量,就像这样将生成器理解与a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower() s = ''.join(c for c in a if c.isalpha()) print(s) 字符串函数结合起来:

ListView

输出:

gokjhohgouigougyyx

答案 4 :(得分:1)

如果您想要列表,请使用列表解析:

print([ch for ch in a if ch.isalpha()])
['g', 'o', 'k', 'j', 'h', 'o', 'h', 'g', 'o', 'u', 'i', 'g', 'o', 'u', 'g', 'y', 'y', 'x']

如果您要删除字符串中的标点符号,数字和空格,可以使用str.translate

from string import punctuation, digits

tbl = str.maketrans({ord(ch):"" for ch in punctuation+digits+" "})

print(a.translate(tbl))

gokjhohgouigougyyx

tbl只是我们要替换的每个字符的ord,我们要替换它的值,在这种情况下是一个空字符串。

答案 5 :(得分:1)

如果你想变得聪明,你也可以看看使用过滤器对象:

>>> def isalpha(c):
...    """ Check if a character is a member of the alphabet """
...    return c.isalpha()
...
>>> s = "This string, or sentence, should have __no__ non-alphabetic characters in it!"
>>> f = filter(isalpha, s)
>>> ''.join(f)
'Thisstringorsentenceshouldhavenononalphabeticcharactersinit'

这可以缩短为:

>>> s="This string, or sentence, should have __no__ non-alphabetic characters in it!"
>>> ''.join(filter(lambda a: a.isalpha(), s))
'Thisstringorsentenceshouldhavenononalphabeticcharactersinit'
>>>