@Timebird

Почему не работает этот код?

Пытаюсь проверить строку на наличие специальных символов. Использовать re запрещается. Написал такой код:

entered = str(input('Enter the string: '))

def check_spec_characters(entered):
    symbols = "[ ~`!@#$%^&*()_-+={}[]:>;',</?*-+ ]"
    for every_character in symbols:
        if every_character in entered:
            return 1
        else:
            return 0

check_spec_characters(entered)

Выдаёт на любой ввод (и со спец. символами тоже) 0. Почему?
  • Вопрос задан
  • 331 просмотр
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
В переменной symbols, на мой взгляд, смысла особого нет, ввиду наличия модуля punctuation.

Проверку на наличие символа/ов можно сделать при помощи list comprehension, например, и, в зависимости от результата, выводить, условно, Да или Нет.

Итого, попробуйте:
>>> from string import punctuation
>>> def check_spec_characters(text):
	     res = [i for i in punctuation if i in text]
	     if res:
		        print('YES')
	     else:
		        print('NO')

>>> text = 'Expression syntax is straightforward: the operators +, -, * and / work as expected'
>>> check_spec_characters(text)
YES
>>> text = 'Expression syntax is straightforward the operators work as expected'
>>> check_spec_characters(text)
NO

Если нужны также сами найденные символы, просто добавьте переменную res в print к выводу:
......
if res:
    print('Special characters found in text: {}'.format(res))
......
>>> text = 'Expression syntax is straightforward: the operators +, -, * and / work as expected'
>>> check_spec_characters(text)
Special characters found in text: ['*', '+', ',', '-', '/', ':']
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
longclaps
@longclaps
Потому что выход из функции происходит на первой же итерации, с результатом по проверке первой буквы.
char_is_special = frozenset("[ ~`!@#$%^&*()_-+={}[]:>;',</?*-+ ]").__contains__

def str_has_special(s):
    return any(map(char_is_special, s))

print(char_is_special("a"), char_is_special("?"))
print(str_has_special("abc"), str_has_special("abc?"))
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
если первый знак из symbols не встречается в строке ввода, возвращается 0.
для наглядности:
entered = str(input('Enter the string: '))

def check_spec_characters(inp):
    symbols = "[ ~`!@#$%^&*()_-+={}[]:>;',</?*-+ ]"
    for symbol in symbols:
        print (symbol+" in "+inp+" = "+ str((symbol in inp)))   

print (check_spec_characters(entered))

вывод:

Enter the string: abc*dfe+gh[`
[ in abc*dfe+gh[` = True
in abc*dfe+gh[` = False
~ in abc*dfe+gh[` = False
` in abc*dfe+gh[` = True
! in abc*dfe+gh[` = False
@ in abc*dfe+gh[` = False
# in abc*dfe+gh[` = False
$ in abc*dfe+gh[` = False
% in abc*dfe+gh[` = False
^ in abc*dfe+gh[` = False
& in abc*dfe+gh[` = False
* in abc*dfe+gh[` = True
( in abc*dfe+gh[` = False
) in abc*dfe+gh[` = False
_ in abc*dfe+gh[` = False
- in abc*dfe+gh[` = False
+ in abc*dfe+gh[` = True
= in abc*dfe+gh[` = False
{ in abc*dfe+gh[` = False
} in abc*dfe+gh[` = False
[ in abc*dfe+gh[` = True
] in abc*dfe+gh[` = False
: in abc*dfe+gh[` = False
> in abc*dfe+gh[` = False
; in abc*dfe+gh[` = False
' in abc*dfe+gh[` = False
, in abc*dfe+gh[` = False
< in abc*dfe+gh[` = False
/ in abc*dfe+gh[` = False
? in abc*dfe+gh[` = False
* in abc*dfe+gh[` = True
- in abc*dfe+gh[` = False
+ in abc*dfe+gh[` = True
in abc*dfe+gh[` = False
] in abc*dfe+gh[` = False
None
Ответ написан
daemonhk
@daemonhk
ПсиХоПат

for every_character in symbols:
if every_character in entered:
return 1
else:
return 0


В первую очередь смущает проверка if every_character in entered:, зачем Вам тогда циклом проходиться по every_character?
Ответ написан
Sly_tom_cat
@Sly_tom_cat
.
entered = str(input('Enter the string: '))

symbols = "[ ~`!@#$%^&*()_-+={}[]:>;',</?*-+ ]"

def check_spec_characters(entered):
    for every_character in entered:
        if every_character in symbols:
            return 1
        else:
            return 0

check_spec_characters(entered)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы