2015-05-17 8 views
0

Я пытаюсь написать код, который находит буквы в строке, содержащей специальные символы, цифры и буквы. Следующий код ничего не возвращает:Поиск букв в строке

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

Выход: & &) & gokjhohgouigougyy^& *^х => Ни

Может кто-нибудь сказать мне, что это проблема, и как я могу это сделать без используя 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='') 
+0

почему вы делаете разделение? –

+1

Каков ожидаемый результат? – thefourtheye

+0

Попробуйте преобразовать в список и посмотреть, поможет ли это. Не уверен, что он помогает, но – pythonnewbie

ответ

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 
>>> 

Одна из вещей, чтобы привыкнуть к в питона разница между свойством и метод - это свойство является то, что вы можете прочитать метод выполняет какое-то действие - 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> 

способ и должен быть вызвано добавлением круглых скобок(), чтобы фактически выполнять свои функции. Стоит также различать методы, возвращающие значение и те, которые действуют на месте.

>>> s.lower() 
'yes! these are words.' 

Возвращает значение, как делает s.split() но sort операция на месте, например:

>>> words = s.lower().split() 
>>> words 
['yes!', 'these', 'are', 'words.'] 
>>> words.sort() 
>>> words 
['are', 'these', 'words.', 'yes!'] 
>>> 
+0

«Позвоните», как в «Я», m Извините, я новичок в python, следовательно, глупый вопрос – pythonnewbie

+0

@pythonnewbie - я расширил ответ выше. –

+0

Ага! глупая ошибка. @Steve – pythonnewbie

1

Вам не нужно разбить его, и вы должны назвать isalpha, как isalpha() вместо потому что они это разные вещи. Это должно печатать все буквы в том, что я предполагаю, формат, который вы хотите.

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

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

Yup, просто сделал это, спасибо тонну :) – pythonnewbie

+0

вам не нужны скобки в если состояние. –

2

Разделение строки возвращает список подстрок. Например: "abc def ghi" .split ("") возвращает ["abc", "def", "ghi"]. Вам не нужно разделить строку на то, что вы пытаетесь. Просто переберитесь по самой строке.

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

Я просто пытался преобразовать его в список и посмотреть, облегчает ли поиск. Затяните синтаксис. Спасибо – pythonnewbie

1

Из кода выглядит более, как вы хотите, чтобы удалить ненужных символов из строки, а не найти те, сохранить.

Итак, если вы хотите распечатать результат:

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

+0

Эй, спасибо тонну. Я решил, что я не называю isalpha правильным способом. Почему вы думаете, что я пытаюсь «удалить» нежелательные элементы, а не извлекать «соответствующие»? Просто любопытно, есть ли разница в том, как python делает работу – pythonnewbie

+0

@pythonnewbie: они по сути одинаковы :) Я изначально неправильно понял ваш вопрос. – mhawke

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 каждого символа мы хотим заменить на значение, которое мы хотим заменить, в этом случае это пустая строка.

+0

Будет ли разница в вышеупомянутом алгоритме и что использование isalpha/loop для извлечения алфавитов с точки зрения времени, памяти и т. Д.? – pythonnewbie

+0

@pythonnewbie. Если бы у вас были большие струны.перевести будет любой другой вариант. Если вам нужен список, то понимание выполняется быстрее, чем при использовании обычного цикла –

+0

Oh! Благодарю. Посмотрите его использование и попробуйте. Спасибо тонну за это. – pythonnewbie

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' 
>>>