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

StackOverflow https://stackoverflow.com/questions/2519670

  •  22-09-2019
  •  | 
  •  

Вопрос

Я посмотрел и искал и не смог найти то, что мне нужно, хотя я думаю, что это должно быть просто (если у вас есть какой -либо опыт 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:

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

Это было полезно?

Решение

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(...).

Другие советы

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

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

Может также слегка сократить его:

if re.match(r'^[\w.-]+$', username):

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

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

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

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

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

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

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

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!"

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

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() кэшируются, поэтому программы, которые используют только несколько регулярных выражений за раз, не нужно беспокоиться о том, чтобы собирать регулярные выражения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top