Код Python для использования регулярного выражения, чтобы убедиться, что строка имеет буквенно-цифровой плюс. - _ - PullRequest
6 голосов
/ 26 марта 2010

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

Учитывая строку, я хочу убедиться, что в Python она содержит ТОЛЬКО буквенно-цифровые символы: a-zA-Z0-9 и . _ -

Примеры:

Принимается:

bill-gates

Steve_Jobs

Micro.soft

Отклонено:

Bill gates - пробелы запрещены

me@host.com - @ не буквенно-цифровой

Я пытаюсь использовать:

if re.match("^[a-zA-Z0-9_.-]+$", username) == True:

Но это не похоже на работу ...

Ответы [ 6 ]

17 голосов
/ 26 марта 2010

re.match не возвращает логическое значение;он возвращает MatchObject в случае совпадения или None в случае несоответствия.

>>> re.match("^[a-zA-Z0-9_.-]+$", "hello")
<_sre.SRE_Match object at 0xb7600250>
>>> re.match("^[a-zA-Z0-9_.-]+$", "    ")
>>> print re.match("^[a-zA-Z0-9_.-]+$", "    ")
None

Итак, вы не должны делать re.match(...) == True;скорее, вы должны проверять re.match(...) is not None в этом случае, который может быть сокращен до if re.match(...).

4 голосов
/ 26 марта 2010

Никогда не используйте == True или == False в сравнении. Многие типы уже имеют эквивалент bool, который вы должны использовать вместо:

if re.match("^[a-zA-Z0-9_.-]+$", username):
2 голосов
/ 26 марта 2010

Можно также немного сократить его до:

if re.match(r'^[\w.-]+$', username):
1 голос
/ 02 июля 2017

Я хотел бы рассмотреть это для действительного имени пользователя:
1) Имя пользователя должно быть длиной 6-30 символов
2) Имя пользователя может содержать только:

  • Прописные и строчные буквы
  • Числа от 0-9 до
  • Специальные символы _ -.

3) Имя пользователя не может:

  • Начать или закончить с символами _ -.

  • Иметь более одного последовательного символа _ -. внутри

Это пример использования:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

0 голосов
/ 28 февраля 2013

Я делаю свою проверку таким образом в моем классе утилит:

def valid_re(self, s, r):
 reg = re.compile(r)
 return reg.match(s)

Затем я вызываю экземпляр utils и проверяю так:

if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'):
        error = "Invalid username!"
0 голосов
/ 26 марта 2010

Если вы собираетесь использовать много регулярных выражений, вы можете скомпилировать их для скорости (или читабельности)

import re 
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$')

for u in users:
    if ALPHANUM.match(u) is None:
        print "invalid"

С Документы :

Скомпилированные версии самых последних шаблонов, переданных в re.match(), re.search() или re.compile(), кэшируются, поэтому программам, которые используют только несколько регулярных выражений за раз, не нужно беспокоиться о компиляции регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...