Давайте посмотрим на само ваше регулярное выражение: (?=.*[a-z])(?=.*[A-Z]).{3,20}
Насколько я могу судить, это то, что делают разные группы:
(?=.*[a-z])
- Предварительное утверждение для любого символа (кроме новой строки), повторяемое любое количество раз, за которым следует строчная буква.
(?=.*[A-Z])
- сделать предварительное утверждение для любого символа (кроме новой строки), повторенное любое количество раз, за которым следует заглавная буква.
.
- Следите за любым другим символом рядом, который не является новой строкой.
{3,20}
- сопоставить этот предыдущий символ от 3 до 20 раз
Поэтому, когда я запускаю это, например:
test_strings = [ 'Papa', 'papa', 'pA', 'pA!', 'pa&Pa', 'pApa', 'pa\nPa' ]
for s in test_strings:
m = re.match('(?=.*[a-z])(?=.*[A-Z]).{3,20}', s)
if m:
print('"%s" is good' % s)
else:
print('"%s" is BAD' % s)
Я получаю эти результаты:
"Papa" is good
"papa" is BAD
"pA" is BAD
"pA!" is good
"pa&Pa" is good
"pApa" is good
"pa
Pa" is BAD
Но если все, что вы действительно хотите сделать, это убедиться, что tempList[1]
- это строка, состоящая только из буквенно-цифровых символов, тогда упрощенное регулярное выражение, которое вы задаете в качестве ответа, имеет больше смысла. Фактически, поскольку вы сопоставляете всю строку, ^
и $
кажутся избыточными.
Что бы это ни стоило, вот способ, которым вы могли бы сделать это в Python без регулярных выражений:
matchObj = tempList[1].isalnum() and len(tempList[1]) in range(3,21)