Удаление пробелов между символами и прекращение ввода пользователя из целых чисел или знаков препинания - PullRequest
0 голосов
/ 15 марта 2020

Привет, я мог бы использовать несколько указателей с моим кодом в нижней части этого поста. (Я начал изучать Python Недавно, кстати, поэтому любая обратная связь, даже если она не относится полностью к вопросу, очень ценится)

Так что в основном мой код должен делать / учитывать следующее:

  1. Распечатайте чей-либо идентификатор пользователя на основе его имени и фамилии.
  2. ИД пользователя не может превышать> 8 символов
  3. Должны использоваться первые 2 символа имени, за которыми следуют последние 6 фамилий.

Все работает, как я хочу, для имен, таких как:

Джон Доу = "jodoe"
Мар ie Anne Richardson = "maardson"

Но все это меняется, когда мы смотрим на такие примеры, как:

JKRowling = "j.owling"
John DOE = "jod oe"

Не знаю Я хочу разрешить использование знаков препинания и целых чисел, и я не могу контролировать пробелы между символами. В некоторых контекстах имена будут примерно такими, как «Mar ie Anne», или люди могут иметь несколько фамилий, поэтому пробел между ними обязательно должен быть разрешен как ввод данных пользователем, но я ищу, чтобы он был удален.

Таким образом, пользователь может ввести «Mar ie Anne Richardson», и это все равно позволит пользователю «maardson». Однако:

«Джон Доу» приведет к «jodoe». «Джон Доу Доу» приведет к «jodoedoe»

Код:

print(
    "Welcome to the UserID Tool, a few questions will be asked to generate your Unique UserID"
)
prompt = ">"
first_name = input(f"What is your First Name?\n{prompt}").lower().strip()
last_name = input(f"What is your Last Name\n{prompt}").lower().strip()

len_first_name = len(first_name)
len_last_name = len(last_name)
max_userid_len = 8

if len_first_name + len_last_name > max_userid_len:
    new_last_name = last_name[-6:].strip()
    print(f"Your user id is {first_name[0:2]}{new_last_name}")
else:
    print(f"Your user id is {first_name[0:2]}{last_name}")

Ответы [ 4 ]

1 голос
/ 15 марта 2020

Для чистого решения регулярных выражений - я бы сделал:

import re

sample_=["John Doe", "J.K.Rowling",  "Marie Anne Richardson", "John D O E", "John Doe Doe"]
res=""
for el in sample_:
    print(f"BEFORE: {el}")
    res=re.sub(r"[^a-z\s]", "", el.lower().strip())
    res=re.sub(r"(?<=\s)([^\s]*)\s", r"\1", res)
    res=re.sub(r"(^[a-z]{1,2}).{0,}?([a-z]{1,6})$", r"\1\2", res)
    print(f"AFTER: {res}")

Выходы:

BEFORE: John Doe
AFTER: jodoe
BEFORE: J.K.Rowling
AFTER: jkowling
BEFORE: Marie Anne Richardson
AFTER: maardson
BEFORE: John D O E
AFTER: jodoe
BEFORE: John Doe Doe
AFTER: jodoedoe

Что там происходит:

Первые 2 re.sub(...) просто избавиться от всех небуквенных символов, кроме первого пробела внутри строки (так что вы можете точно различать guish какое первое слово в имени - получить первые 1-2 символа).

Второй: "(^[a-z]{1,2}).{0,}?([a-z]{1,6})$" pull:

(1) (группа 1 - из-за квадратных скобок) (^[a-z]{1,2}) соответствует первым двум буквам строки, тогда как это жадный оператор, поэтому он будет соответствовать всем 2, если есть внутренняя часть 2.

(2): .{0,}? соответствует любому количеству символов, хотя и не является жадным (вот что указывает вопросительный знак) - следовательно, он будет совпадать с небольшим насколько это возможно.

(3) (группа 2 - из-за квадратных скобок) ([a-z]{1,6})$ будет соответствовать до 6 последним символам в конце, тогда как снова это жадный оператор, следовательно, он будет соответствовать максимально возможному .

Вся строка соответствует тому, что мы заменили на группу 1 и группу 2 (h Кроме того, мы опускаем внутреннюю часть).

Некоторые ссылки на python регулярное выражение lib: re:

https://docs.python.org/3.5/library/re.html

1 голос
/ 15 марта 2020

Я предлагаю вам использовать функцию replace() для ваших целей.

Вы можете написать: new_first_name = first_name.replace(".", "")

Чтобы заменить несколько подстрок, вы должны использовать словарь, как в этом примере: Как заменить несколько подстрок строки?

0 голосов
/ 15 марта 2020

Часто имеет смысл создать функцию для экранного ввода, например:

def get_input(query):
    while True:     #endless loop broken by return of acceptable input
        acceptable = True
        foo = input(query)
        for x in foo:
            if not(x.isalpha() or x.isspace()): #positive selection
                print("No numbers or punctuation allowed")
                acceptable = False
                break
        if len(foo.split()[0]) < 2:    #first word length check
            print("First name must have at least two letters")
            acceptable = False
        if acceptable:   #break up string, erase all whitespace, insert
                         #one whitespace after first name, return
            return foo.split()[0] + ' ' + ''.join(foo.split()[1:])   

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

0 голосов
/ 15 марта 2020

Может быть, использовать функцию .replace (). Если вас беспокоит только «.» и «» вы можете использовать эти несколько строк:

name = input(“Tell the name”)
name1 = name.replace(".", "")
name2 = name1.replace(“ “,””)
...