查找字符串中的字母
Finding letters in a string
我正在尝试编写一个代码来查找包含特殊字符、数字和字母的字符串中的字母。下面的代码returns什么都没有:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)
final = a.split()
for y in final:
if (y.isalpha == True):
print(y)
输出:&&)&gokjhohgouigougyy^&*^x
=> None
有人能告诉我问题出在哪里吗?如果不使用 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='')
您需要将 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
列出两者 所以对于字符串 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>
是一个方法,需要通过加括号()来调用,才能真正执行它们的功能。区分 return 一个值的方法和那些就地操作的方法也是值得的。
>>> s.lower()
'yes! these are words.'
Returns 与 s.split()
一样的值,但 sort
是就地操作,例如:
>>> words = s.lower().split()
>>> words
['yes!', 'these', 'are', 'words.']
>>> words.sort()
>>> words
['are', 'these', 'words.', 'yes!']
>>>
您不需要将其拆分,您应该将 isalpha
称为 isalpha()
,因为它们是不同的东西。这应该以我认为是您想要的格式打印所有字母。
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)
for y in a:
if y.isalpha():
print(y)
拆分字符串 returns 子字符串列表。例如:"abc def ghi".split(" ") returns ["abc", "def", "ghi"]。
你不需要为你正在尝试的东西拆分字符串。只需遍历字符串本身。
string = "&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
for char in string:
if char.isalpha():
print(char)
从您的代码来看,您更像是想从字符串中删除 不需要的字符,而不是找到要保留的字符。
所以,如果你想打印结果:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
for c in a:
if c.isalpha():
print(c)
输出:
g
o
k
...
y
y
x
但通常您会希望将过滤后的字符串分配给一个变量,例如将生成器理解与 join()
字符串函数相结合的变量:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
s = ''.join(c for c in a if c.isalpha())
print(s)
输出:
gokjhohgouigougyyx
如果你想要一个列表,使用列表理解:
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
,在这种情况下是一个空字符串。
如果你想变得聪明,你也可以看看使用过滤器对象:
>>> 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'
>>>
我正在尝试编写一个代码来查找包含特殊字符、数字和字母的字符串中的字母。下面的代码returns什么都没有:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)
final = a.split()
for y in final:
if (y.isalpha == True):
print(y)
输出:&&)&gokjhohgouigougyy^&*^x => None
有人能告诉我问题出在哪里吗?如果不使用 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='')
您需要将 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
列出两者 所以对于字符串 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>
是一个方法,需要通过加括号()来调用,才能真正执行它们的功能。区分 return 一个值的方法和那些就地操作的方法也是值得的。
>>> s.lower()
'yes! these are words.'
Returns 与 s.split()
一样的值,但 sort
是就地操作,例如:
>>> words = s.lower().split()
>>> words
['yes!', 'these', 'are', 'words.']
>>> words.sort()
>>> words
['are', 'these', 'words.', 'yes!']
>>>
您不需要将其拆分,您应该将 isalpha
称为 isalpha()
,因为它们是不同的东西。这应该以我认为是您想要的格式打印所有字母。
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
print(a)
for y in a:
if y.isalpha():
print(y)
拆分字符串 returns 子字符串列表。例如:"abc def ghi".split(" ") returns ["abc", "def", "ghi"]。 你不需要为你正在尝试的东西拆分字符串。只需遍历字符串本身。
string = "&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
for char in string:
if char.isalpha():
print(char)
从您的代码来看,您更像是想从字符串中删除 不需要的字符,而不是找到要保留的字符。
所以,如果你想打印结果:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
for c in a:
if c.isalpha():
print(c)
输出:
g o k ... y y x
但通常您会希望将过滤后的字符串分配给一个变量,例如将生成器理解与 join()
字符串函数相结合的变量:
a ="&*&)*&GOKJHOHGOUIGougyY^&*^x".lower()
s = ''.join(c for c in a if c.isalpha())
print(s)
输出:
gokjhohgouigougyyx
如果你想要一个列表,使用列表理解:
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
,在这种情况下是一个空字符串。
如果你想变得聪明,你也可以看看使用过滤器对象:
>>> 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'
>>>