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?
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 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.
You could use regular expressions:
all_uppercase = bool(re.match(r'[A-Z]+$', word))
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
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
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
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