Проверка каждого символа в строке с помощью регулярного выражения - python - PullRequest
0 голосов
/ 17 января 2020

Я хочу проверить строку и подтвердить, что она содержит только прописные или строчные буквы алфавита, а также подчеркивания. У меня пока что есть, но я получаю ошибки

import re

def addPlayer():
    print("\nEnter the players name:")
    playerName = input()

    for x in range(len(playerName)):
        if re.match("[a-zA-Z_]", x):
            return
        else:
            print("Error: Please enter a valid name.")
            addPlayer()
Traceback (most recent call last):
    File "player.py", line 9, in addPlayer
    if re.match("[a-zA-Z_]", x):
  File "c:.....Python\Python38-32\lib\re.py", line 189, in match
    return _compile(pattern, flags).match(string)
TypeError: expected string or bytes-like object

Ответы [ 5 ]

1 голос
/ 17 января 2020

Итак, буквальная причина этой ошибки в том, что x в целом числе. Поэтому re.match (pattern, str (x)) исправляет сообщение об ошибке. С учетом сказанного, вот еще один (возможно, более простой) способ сделать это:

valid_chars = set([*string.ascii_uppercase, *string.ascii_lowercase, "_"])

for char in string:
    if char not in valid_chars:
        # Error Condition
## Acceptance Condition
1 голос
/ 17 января 2020

Вы можете проверить все свое имя пользователя сразу, проверив, что все символы в строке находятся в классе символов [A-Za-z_] т.е.

import re

def addPlayer():
    print("\nEnter the players name:")
    playerName = input()

    if not re.match(r'^[A-Za-z_]+$', playerName):
        print("Error: Please enter a valid name.")
        addPlayer()
1 голос
/ 17 января 2020

x - это число, и вы передали его re.match

Ваше значение для l oop должно быть таким:

for char in playerName:
    if re.match("[a-zA-Z_]", char):
        return
    else:
        print("Error: Please enter a valid name.")
        addPlayer()

или событие лучше

regex = re.compile(r'[^a-zA-Z_]')
print(not bool(regex.search("abs123"))) # does not match
print(not bool(regex.search("abs"))) # match 
0 голосов
/ 17 января 2020
    for x in range(len(playerName)):
        if re.match("[a-zA-Z_]", x):
            return

тип x имеет тип int, а не строку.

Вы можете использовать

    for x in playerName:
        if re.match("[a-zA-Z_]", x):
            pass

или

for x in playerName:
    if not x in string.ascii_letters+'_':
        print("Error: Please enter a valid name.")
        addPlayer()
0 голосов
/ 17 января 2020

Ты не хочешь

import re

def addPlayer():

    playerName='testT_'

    m = re.match("[\w_]", playerName)
    if m:
      print("Success")
    else:
      print("Error: Please enter a valid name.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...