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