Если введенная пользователем строка пуста, числовая или имеет не ascii-Python

#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: ')