Check if all characters of a string are uppercase
Question:
Say I have a string that can contain different characters:
e.g. word = "UPPER£CASe"
How would I test the string to see if all the characters are uppercase and no other punctuation, numbers, lowercase letters etc?
Answers:
You could use regular expressions:
all_uppercase = bool(re.match(r'[A-Z]+$', word))
You should use str.isupper()
and str.isalpha()
function.
Eg.
is_all_uppercase = word.isupper() and word.isalpha()
According to the docs:
S.isupper() -> bool
Return True
if all cased characters in S
are uppercase and there is at
least one cased character in S
, False
otherwise.
Yash Mehrotra has the best answer for that problem, but if you’d also like to know how to check that without the methods, for purely educational reasons:
import string
def is_all_uppercase(a_str):
for c in a_str:
if c not in string.ascii_uppercase:
return False
return True
You can alternatively work at the level of characters.
The following function may be useful not only for words but also for phrases:
def up(string):
upper=[ch for ch in string if ch.isupper() or ch.isspace()]
if len(upper)==len(string):
print('all upper')
else:
print("some character(s) not upper")
strings=['UPPERCAS!', 'UPPERCASe', 'UPPERCASE', 'MORE UPPERCASES']
for s in strings:
up(s)
Out: some character(s) not upper
Out: some character(s) not upper
Out: all upper
Out: all upper
Here you can find a very useful way to check if there’s at least one upper or lower letter in a string
Here’s a brief example of what I found in this link:
print(any(l.isupper() for l in palabra))
https://www.w3resource.com/python-exercises/python-basic-exercise-128.php
Using the same approach taken by Diogo Martins, but using all()
and a generator as an alternative to the for/if/return
construct for a more elegant and pythonic solution:
import string
is_all_uppercase = all(c in string.ascii_uppercase for c in word)
It avoids scanning the string twice by testing each character only once, and it short-circuits on the first failed character.
Or, to optimize it further:
upper = set('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
is_all_uppercase = all(c in upper for c in word)
However, for common inputs this does not perform better than the accepted solution word.isalpha() and word.isupper()
: by using C-compiled builtin methods it beats any pure-python solution even if it scans the string twice:
$ python3 -m timeit -s 'word="UPPER£CASe"; upper=set("ABCDEFGHIJKLMNOPQRSTUWXYZ")' --
'all(c in upper for c in word)'
1000000 loops, best of 3: 0.514 usec per loop
$ python3 -m timeit -s 'word="UPPER£CASe"' -- 'word.isupper() and word.isalpha()'
10000000 loops, best of 3: 0.0446 usec per loop
Please note that str.isupper() and str.isalpha()
includes Unicode characters such as Greek, Cyrilic ("russian"), Arabic, etc. As long as they’re uppercase 😉
>>> word = "ΓΔΘΞΠΦΨΩБГДЖЙЛ"; word.isupper() and word.isalpha()
True
Say I have a string that can contain different characters:
e.g. word = "UPPER£CASe"
How would I test the string to see if all the characters are uppercase and no other punctuation, numbers, lowercase letters etc?
You could use regular expressions:
all_uppercase = bool(re.match(r'[A-Z]+$', word))
You should use str.isupper()
and str.isalpha()
function.
Eg.
is_all_uppercase = word.isupper() and word.isalpha()
According to the docs:
S.isupper() -> bool
Return
True
if all cased characters inS
are uppercase and there is at
least one cased character inS
,False
otherwise.
Yash Mehrotra has the best answer for that problem, but if you’d also like to know how to check that without the methods, for purely educational reasons:
import string
def is_all_uppercase(a_str):
for c in a_str:
if c not in string.ascii_uppercase:
return False
return True
You can alternatively work at the level of characters.
The following function may be useful not only for words but also for phrases:
def up(string):
upper=[ch for ch in string if ch.isupper() or ch.isspace()]
if len(upper)==len(string):
print('all upper')
else:
print("some character(s) not upper")
strings=['UPPERCAS!', 'UPPERCASe', 'UPPERCASE', 'MORE UPPERCASES']
for s in strings:
up(s)
Out: some character(s) not upper
Out: some character(s) not upper
Out: all upper
Out: all upper
Here you can find a very useful way to check if there’s at least one upper or lower letter in a string
Here’s a brief example of what I found in this link:
print(any(l.isupper() for l in palabra))
https://www.w3resource.com/python-exercises/python-basic-exercise-128.php
Using the same approach taken by Diogo Martins, but using all()
and a generator as an alternative to the for/if/return
construct for a more elegant and pythonic solution:
import string
is_all_uppercase = all(c in string.ascii_uppercase for c in word)
It avoids scanning the string twice by testing each character only once, and it short-circuits on the first failed character.
Or, to optimize it further:
upper = set('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
is_all_uppercase = all(c in upper for c in word)
However, for common inputs this does not perform better than the accepted solution word.isalpha() and word.isupper()
: by using C-compiled builtin methods it beats any pure-python solution even if it scans the string twice:
$ python3 -m timeit -s 'word="UPPER£CASe"; upper=set("ABCDEFGHIJKLMNOPQRSTUWXYZ")' --
'all(c in upper for c in word)'
1000000 loops, best of 3: 0.514 usec per loop
$ python3 -m timeit -s 'word="UPPER£CASe"' -- 'word.isupper() and word.isalpha()'
10000000 loops, best of 3: 0.0446 usec per loop
Please note that str.isupper() and str.isalpha()
includes Unicode characters such as Greek, Cyrilic ("russian"), Arabic, etc. As long as they’re uppercase 😉
>>> word = "ΓΔΘΞΠΦΨΩБГДЖЙЛ"; word.isupper() and word.isalpha()
True