Python: Регулярное выражение для соответствия буквенно-числовому не работает?

Я ищу соответствие строки, введенной с веб-сайта, чтобы проверить, является ли она буквенно-цифровым и, возможно, содержит символ подчеркивания. Мой код:

if re.match('[a-zA-Z0-9_]',playerName):
            # do stuff

По какой-то причине это соответствует сумасшедшим символам, например: nIg ○ ▲ ☆ ★ ◇ ◆

Мне нужны только регулярные A-Z и 0-9 и _ соответствующие, есть ли что-то, что я здесь отсутствует?

Ответы

Ответ 1

Python имеет специальную последовательность \w для сопоставления буквенно-цифровых символов и подчеркивания, если флаги LOCALE и UNICODE не указаны. Таким образом, вы можете изменить свой шаблон как

pattern = '^\w+$'

Ответ 2

Ваше регулярное выражение соответствует только одному символу. Вместо этого попробуйте:

if re.match('^[a-zA-Z0-9_]+$',playerName): 

Ответ 3

... проверьте, является ли альфа-числовое значение и, возможно, содержит символ подчеркивания.

Вы имеете в виду это буквально, так что разрешено только одно подчеркивание? (Небезопасно для имен игроков, в частности, для подчеркивания других игроков могут быть трудными для других игроков.) Должно ли "a_b_c" не соответствовать?

Если да:

if playerName and re.match("^[a-zA-Z0-9]*_?[a-zA-Z0-9]*$", playerName):

Новая первая часть условия проверяет пустое значение, что упрощает регулярное выражение.

Это не создает ограничений на то, где может быть подчеркнуто подчеркивание, поэтому все "_a", "a_" и "_" будут совпадать. Если вместо этого вы хотите предотвратить как ведущие, так и завершающие символы подчеркивания, что опять же разумно для имен игроков, измените на:

if re.match("^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)?$", playerName):
// this regex doesn't match an empty string, so that check is unneeded