如何检查是否存在小写字母?

时间:2014-04-10 19:17:08

标签: python string

我一直在使用Python中的。islower().isupper()方法观察异常行为。例如:

>>> test = '8765iouy9987OIUY'
>>> test.islower()
False
>>> test.isupper()
False

但是,以下混合字符串值似乎有效:

>>> test2 = 'b1'
>>> test2.islower()
True
>>> test2.isupper()
False

我不明白这种异常现象。如何检测test中的小写字母?

6 个答案:

答案 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)

来自the documentation

  

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