我一直在使用Python中的。islower()
和.isupper()
方法观察异常行为。例如:
>>> test = '8765iouy9987OIUY'
>>> test.islower()
False
>>> test.isupper()
False
但是,以下混合字符串值似乎有效:
>>> test2 = 'b1'
>>> test2.islower()
True
>>> test2.isupper()
False
我不明白这种异常现象。如何检测test
中的小写字母?
答案 0 :(得分:12)
islower()
和isupper()
仅返回True
。
你必须测试个别角色; any()
和生成器表达式使其相对有效:
>>> test = '8765iouy9987OIUY'
>>> any(c.islower() for c in test)
True
>>> any(c.isupper() for c in test)
True
答案 1 :(得分:6)
islower判断() 如果字符串中的所有外壳字符都是小写且至少有一个外壳字符,则返回true,否则返回false。
isupper() 如果字符串中的所有外壳字符都是大写且至少有一个外壳字符,则返回true,否则返回false。
更明确一点,"1".islower()
和"1".isupper()
都会返回False
。如果没有套装字母,则两个函数都返回false。
如果要删除所有小写字母,可以:
>>> test = '8765iouy9987OIUY'
>>> "".join([i for i in test if not i.islower()])
'87659987OIUY'
答案 2 :(得分:5)
您可以使用re模块:
import re
print re.findall(r"[a-z]",'8765iouy9987OIUY')
输出:
['i', 'o', 'u', 'y']
如果没有匹配项,您将获得[]
作为输出。正则表达式匹配从a到z的所有字符。
答案 3 :(得分:3)
或者您可以尝试map()
:
map(str.isupper, '8765iouy9987OIUY')
# output: [False, False, False, False, False, False, False, False,
# False, False, False, False, True, True, True, True]
然后使用any()
检查任何大写字母:
any(map(str.isupper, '8765iouy9987OIUY'))
# output: True
答案 4 :(得分:0)
对于需要至少1个字符的上限,下限和数字的密码策略。我认为这是最可读和最直接的方法。
def password_gen():
while True:
password = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for n in range(12))
tests = {}
tests['upper'] = any(char.isupper() for char in password)
tests['lower'] = any(char.islower() for char in password)
tests['digit'] = any(char.isdigit() for char in password)
if all(tests.values()):
break
return password
答案 5 :(得分:0)
这可以如下选择进行:
test = '8765iouy9987OIUY'
print(test == test.upper()) # returns False as some letters are small
test = '222WWWW'
print(test == test.upper()) # returns True as no letters are small