擅长:python、mysql、java
<pre><code>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'
</code></pre>
<p>更有趣的是这个regex,它将报告缺少的字符类型:</p>
<pre><code>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']
</code></pre>
<p>最后,这里是gnibbler提出的一种优秀的基于规则的方法的变体。</p>
<pre><code>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']
</code></pre>