#python #string #alphanumeric
#python #строка #буквенно-цифровая
Вопрос:
Когда пользователь вводит первое имя, и если оно пустое, или содержит цифру, или буквенно-цифровое обозначение, или имеет символы, отличные от ascii, я не собираюсь вставлять его в базу данных.
Приведенный ниже код не принимает допустимые входные данные, он работает, только если я использую len
и isDigit
эти 2 условия.
while (len(f_name) == 0 or f_name.isdigit()
или
f_name.encode('ascii',errors='ignore') or f_name.isalnum()):
Create new user: Y/N ?y
Enter first name: ui
First name cannot be empty or have numeric values
Может кто-нибудь, пожалуйста, объяснить, как исправить эту проблему? Спасибо за ваше время. Остальная часть кода приведена ниже:
import sqlite3
#connect a built in function to connect or create db
conn=sqlite3.connect('phonebook.db')
#Create a cursor function which allows us to do sql operations
crsr=conn.cursor()
#This function to check if table exists
def create_Table():
#Check if the table exists or not
crsr.execute("SELECT name FROM sqlite_master WHERE name='phonebook'")
tableSize=len(crsr.fetchall())#will be greater than 0 if table exists
if tableSize>0:
print()
else:
#create the table
crsr.execute(""" Create Table phonebook(
FirstName text NOT NULL,
LastName text,
Phone text PRIMARY KEY NOT NULL)
""")
#check if table got created or not
crsr.execute("SELECT name FROM sqlite_master WHERE name='phonebook'")
tableSize = len(crsr.fetchall()) # will be greater than 0 if table exists
if tableSize > 0:
print('Table was created successfully')
#This function will create new users and insert in DB
def create_User():
try:
while True:
rsp = input('Create new user: Y/N ?')
if rsp == 'y':
f_name = input('Enter first name: ')
# First name cannot be empty or have numeric values
while (len(f_name) == 0 or f_name.isdigit() or f_name.encode('ascii',errors='ignore') or f_name.isalnum()):
print('First name cannot be empty or have numeric values')
f_name = input('Enter first name: ')
l_name = input('Enter last name: ')
phone = input('Enter phone number: ')
crsr.execute("INSERT INTO phonebook VALUES (:FirstName, :LastName, :Phone)",
{'FirstName': f_name, 'LastName': l_name, 'Phone': phone})
conn.commit()
if rsp == 'n':
break
except:
print('UNIQUE constraint failed: phone number already exists')
Комментарии:
1. Можете ли вы привести нам пример того, какое имя пользователя в настоящее время принимается, но не должно?
2. Джеймс, Эми должны быть приняты, но не 2345, или Am4y, или Am $ anda. Спасибо
3. Условие:
f_name.isalnum()
будетTrue
для имени"ui"
.4. Это кажется связанным: kalzumeus.com/2010/06/17 /…
Ответ №1:
Используйте isalpha
, чтобы убедиться, что строка состоит только из букв:
f_name = input('Enter first name: ')
if f_name and f_name.isalpha():
# your ACCEPTED logic here
Кроме того, если вам нужно проверить, что эти буквы являются ASCII, вы можете легко сравнить их длину в кодировке с самими собой:
f_name = input('Enter first name: ')
if f_name and f_name.isalpha() and len(f_name) == len(f_name.encode()):
# your ACCEPTED logic here
РЕДАКТИРОВАТЬ Добавлена проверка пустой строки (т. е. if f_name
)
Комментарии:
1. Если OP не хочет использовать весь диапазон unicode для имени (по каким-либо причинам), он должен быть согласен с использованием других законных имен.
2. @Serge уже видел комментарий OPs. Я мог бы добавить дополнительное условие для
,
, но я предпочитаю дождаться объявления полных условий. Возможно,.
также принимается, кто знает. Или запятая сама по себе не будет принята и т.д. Необходимо уточнить.3. Отличная дискуссия, извините, если я не разъяснил все требования должным образом. Это обсуждение дает мне больше идей для тестирования.
Ответ №2:
Если вас устраивают регулярные выражения, вы можете проверить условия «не должно быть пустым» и «не должно содержать цифр» следующим образом:
import re
# match one or more characters that range from a to z or A to Z
username_check = re.compile(r'[a-zA-Z] ')
...
while True:
if rsp == 'y':
f_name = input('Enter first name: ')
while not username_check.fullmatch(f_name):
print('First name cannot be empty or have numeric values')
f_name = input('Enter first name: ')
Приятная особенность регулярных выражений заключается в том, что вы можете довольно гибко расширить текущее минимальное решение для тестирования очень специфических шаблонов:
import re
# allow unicode word characters
allowed = re.compile(r'w ')
# numbers are still not allowed
forbidden = re.compile(r'd')
while True:
f_name = input('Enter first name: ')
while not (allowed.fullmatch(f_name) and not forbidden.search(f_name)):
print('First name cannot be empty or have numeric values')
f_name = input('Enter first name: ')