Я смотрел и искал и не мог найти то, в чем я нуждался, хотя я думаю, что это должно быть просто (если у Вас есть опыт 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 (...) не равно None
в этом случае, что может быть сокращено до , если re.match (...)
.
Никогда не используйте == True
или ] == Ложь
в сравнении.Многие типы уже имеют эквивалент типа bool, который вы должны использовать вместо этого:
if re.match("^[a-zA-Z0-9_.-]+$", username):
Может также немного сократите его до:
if re.match(r'^[\w.-]+$', 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()
, кэшируются, поэтому программам, использующим только несколько регулярных выражений за раз, не нужно беспокоиться о компиляции регулярных выражений.