If语句检查字符串是否有大写字母、小写字母和numb

2024-05-26 19:54:18 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给出一个如何测试字符串的想法吗:

  • 至少包含一个大写字母
  • 至少包含一个小写字母
  • 至少包含一个数字
  • 最小长度为7个字符

Tags: 字符串数字大写字母个字符小写字母
2条回答
import re

s   = 'fooBar3'
rgx = re.compile(r'\d.*?[A-Z].*?[a-z]')

if rgx.match(''.join(sorted(s))) and len(s) >= 7:
    print 'ok'

更有趣的是这个regex,它将报告缺少的字符类型:

s = 'fooBar'

rules = [
    r'(?P<digit>\d)?',
    r'(?P<upper>[A-Z])?',
    r'(?P<lower>[a-z])?',
]

rgx      = re.compile(r'.*?'.join(rules))
checks   = rgx.match(''.join(sorted(s))).groupdict()
problems = [k for k,v in checks.iteritems() if v is None]

print checks   # {'upper': 'B', 'digit': None, 'lower': 'a'}
print problems # ['digit']

最后,这里是gnibbler提出的一种优秀的基于规则的方法的变体。

s = 'fooBar'

rules = [
    lambda s: any(x.isupper() for x in s) or 'upper',
    lambda s: any(x.islower() for x in s) or 'lower',
    lambda s: any(x.isdigit() for x in s) or 'digit',
    lambda s: len(s) >= 7                 or 'length',
]

problems = [p for p in [r(s) for r in rules] if p != True]

print problems  # ['digit', 'length']
if (any(x.isupper() for x in s) and any(x.islower() for x in s) 
    and any(x.isdigit() for x in s) and len(s) >= 7):

另一种方法是将规则表示为(lambda)函数列表

rules = [lambda s: any(x.isupper() for x in s), # must have at least one uppercase
        lambda s: any(x.islower() for x in s),  # must have at least one lowercase
        lambda s: any(x.isdigit() for x in s),  # must have at least one digit
        lambda s: len(s) >= 7                   # must be at least 7 characters
        ]

if all(rule(s) for rule in rules):
    ...

关于你的评论。生成错误消息

errors = []
if not any(x.isupper() for x in password):
    errors.append('Your password needs at least 1 capital.')
if not any(x.islower() for x in password):
    errors.append(...)
...

if errors:
    print " ".join(errors)

相关问题 更多 >

    热门问题