простейшая валидация e-mail без regexp и без использования list
Уважаемые форумчане, добрый вечер! Есть вопрос, понимаю смысл ошибки, но не могу найти правильное решение данной проблемы. Имеется следующая задача: напишите валидатор для поля email, используя только пройденный материал + инструкцию, находящуюся в этой задаче. Валидатор - это программа, которая проверяет корректность введенных данных. Если введенный адрес электронной почты валиден, то выведите YES, иначе NO.
Входные данные: email - строковое значение
Выходные данные: YES - если email валиден, NO - если email не валиден
Маска для поля email: @.___ - где ___ может содержать a-z, A-Z, 0-9 и точки. Каждый из блоков, кроме первого (до символа @) должен содержать хотя бы одну букву.
Пользоваться регулярными выражениями и списками нельзя, пытаюсь организовать посимвольное рсанение и проверку того, что после @ точка не является следующим символом.
# Простой валидатор почтового адреса (без использования regual expression)
# ввод строки пользователем
input_adr = input()
# счетчик первого символа (проверяем есть ли в адресе хотя бы один символ)
inint_count = 0
# верный адрес почты
correct_adr = '[email protected]'
# поиск символов '.', '@' во входой строке
for i in input_adr:
at = '@'
dot = '.'
# проверяем наличие первого символа в строке, которую ввел пользователь
# до символа @, первый блок
for inint_count in input_adr:
if((ord(input_adr[inint_count])>= 48 and ord(input_adr[inint_count])<= 57) or
(ord(input_adr[inint_count])>=64 and ord(input_adr[inint_count])<=90)
or (ord(input_adr[inint_count])>= 97 and ord(input_adr[inint_count])<= 122)):
inint_count += 1
# проверяем условия, что после символа @ идет хотя бы один символ,
# что символы @ и . не идут вместе
if(inint_count > 0 and at > 0 and (dot-at) > 0 and (dot+1) < len(input_adr)):
print("Yes")
else:
print("No")
Возникающая ошибка:
File "main.py", line 20, in <module>
if((ord(input_adr[inint_count]>= 48) and ord(input_adr[inint_count]<= 57)) or
TypeError: string indices must be integers
Ответы (1 шт):
if((ord(input_adr[inint_count]>= 48) and ord(input_adr[inint_count]<= 57)) or
считайте скобки - у вас получается следующее
ord(input_adr[inint_count]>= 48)
т.е. вы ord делаете от булева типа ord(True) или ord(False)
скорее всего вы имели в виду
ord(input_adr[inint_count]) >= 48
P.S.
а вообще код по указанным правилам я бы сделал так:
address = '[email protected]'
address_parts = address.split('@')
checked = address.count('@') == 1
# проверить наличие точки
checked &= '.' in address_parts[1]
# проверить наличие хотя бы одной буквы
checked &= any(letter.isalpha() for letter in address_parts[1])
# проверить наличие букв, цифр и точки
checked &= all((letter.isalpha() or letter.isdigit() or letter == '.') for letter in address_parts[1])
# ВНИМАНИЕ: в условии не сказано проверять блок до @, так что последнюю проверку можно удалить скорее всего
# проверить наличие букв, цифр и точки
checked &= all((letter.isalpha() or letter.isdigit() or letter == '.') for letter in address_parts[0])
print(checked)
P.P.S.
если вообще ничего нельзя использовать, то можно вот такой код:
address = '[email protected]'
checked = True
# проверить кол-во символов @
symbols_count = 0
for i in address:
symbols_count += 1 if i == '@' else 0
checked &= symbols_count == 1
# найти координату '@'
symbol_pos = 0
for pos in range(len(address)):
if address[pos] == '@':
symbol_pos = pos + 1
break
# проверить наличие точки
isDot = False
for pos in range(symbol_pos, len(address)):
isDot |= address[pos] == '.'
checked &= isDot
# проверить наличие хотя бы одной буквы
isAlpha = False
for pos in range(symbol_pos, len(address)):
isAlpha |= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z')
checked &= isAlpha
# проверить наличие букв, цифр и точки
isLetters = True
for pos in range(symbol_pos, len(address)):
isLetters &= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z') or ord('0') <= ord(address[pos]) <= ord('9') or address[pos] == '.'
checked &= isLetters
print(checked)
P.P.P.S.
кок который оценивает не только часть после @, но и отдельно блоки между точками в этой части:
address = '@a.com'
checked = True
# проверить кол-во символов @
symbols_count = 0
for i in address:
symbols_count += 1 if i == '@' else 0
checked &= symbols_count == 1
# найти координату '@'
symbol_pos = 0
for pos in range(len(address)):
if address[pos] == '@':
symbol_pos = pos + 1
break
# проверить наличие точки
isDot = False
for pos in range(symbol_pos, len(address)):
isDot |= address[pos] == '.'
checked &= isDot
# проанализировать блоки (расположенные между точками)
start = symbol_pos
for index in range(symbol_pos, len(address)):
if address[index] == '.' or index == len(address) - 1:
finish = index if address[index] == '.' else (index + 1)
# проверить наличие хотя бы одной буквы
isAlpha = False
for pos in range(start, finish):
isAlpha |= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z')
checked &= isAlpha
# проверить наличие букв, цифр и точки
isLetters = True
for pos in range(start, finish):
isLetters &= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z') or ord('0') <= ord(address[pos]) <= ord('9')
checked &= isLetters
start = index + 1
print(checked)