Ответ 1
Python имеет специальную последовательность \w
для сопоставления буквенно-цифровых символов и подчеркивания, если флаги LOCALE
и UNICODE
не указаны. Таким образом, вы можете изменить свой шаблон как
pattern = '^\w+$'
Я ищу соответствие строки, введенной с веб-сайта, чтобы проверить, является ли она буквенно-цифровым и, возможно, содержит символ подчеркивания. Мой код:
if re.match('[a-zA-Z0-9_]',playerName):
# do stuff
По какой-то причине это соответствует сумасшедшим символам, например: nIg ○ ▲ ☆ ★ ◇ ◆
Мне нужны только регулярные A-Z и 0-9 и _ соответствующие, есть ли что-то, что я здесь отсутствует?
Python имеет специальную последовательность \w
для сопоставления буквенно-цифровых символов и подчеркивания, если флаги LOCALE
и UNICODE
не указаны. Таким образом, вы можете изменить свой шаблон как
pattern = '^\w+$'
Ваше регулярное выражение соответствует только одному символу. Вместо этого попробуйте:
if re.match('^[a-zA-Z0-9_]+$',playerName):
... проверьте, является ли альфа-числовое значение и, возможно, содержит символ подчеркивания.
Вы имеете в виду это буквально, так что разрешено только одно подчеркивание? (Небезопасно для имен игроков, в частности, для подчеркивания других игроков могут быть трудными для других игроков.) Должно ли "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