229

I know about islower and isupper, but can you check whether or not that character is a letter? For Example:

>>> s = 'abcdefg' >>> s2 = '123abcd' >>> s3 = 'abcDEFG' >>> s[0].islower() True >>> s2[0].islower() False >>> s3[0].islower() True 

Is there any way to just ask if it is a character besides doing .islower() or .isupper()?

2
  • 2
    Please note that "word character" in programming usually refers to letters and numbers and underscores. This question is actually asking about "letters"; if you need to see if a character is a word character, the best way I've found is character.isalnum() or character == "_". Commented Aug 13, 2016 at 22:49
  • 1
    I know but I asked this like 3 years ago when I first started out programming. Feel free to edit it. Commented Aug 13, 2016 at 23:46

8 Answers 8

344

You can use str.isalpha().

For example:

s = 'a123b' for char in s: print(char, char.isalpha()) 

Output:

a True 1 False 2 False 3 False b True 
Sign up to request clarification or add additional context in comments.

1 Comment

please note, it is so good it works for various alphabets as well: >>> print [x.isalpha() for x in u'Español-한국어'] gives you [True, True, True, True, True, True, True, False, True, True, True] as expected
45
str.isalpha() 

Return true if all characters in the string are alphabetic and there is at least one character, false otherwise. Alphabetic characters are those characters defined in the Unicode character database as “Letter”, i.e., those with general category property being one of “Lm”, “Lt”, “Lu”, “Ll”, or “Lo”. Note that this is different from the “Alphabetic” property defined in the Unicode Standard.

In python2.x:

>>> s = u'a1中文' >>> for char in s: print char, char.isalpha() ... a True 1 False 中 True 文 True >>> s = 'a1中文' >>> for char in s: print char, char.isalpha() ... a True 1 False � False � False � False � False � False � False >>> 

In python3.x:

>>> s = 'a1中文' >>> for char in s: print(char, char.isalpha()) ... a True 1 False 中 True 文 True >>> 

This code work:

>>> def is_alpha(word): ... try: ... return word.encode('ascii').isalpha() ... except: ... return False ... >>> is_alpha('中国') False >>> is_alpha(u'中国') False >>> >>> a = 'a' >>> b = 'a' >>> ord(a), ord(b) (65345, 97) >>> a.isalpha(), b.isalpha() (True, True) >>> is_alpha(a), is_alpha(b) (False, True) >>> 

Comments

4

I found a good way to do this with using a function and basic code. This is a code that accepts a string and counts the number of capital letters, lowercase letters and also 'other'. Other is classed as a space, punctuation mark or even Japanese and Chinese characters.

def check(count): lowercase = 0 uppercase = 0 other = 0 low = 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' upper = 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' for n in count: if n in low: lowercase += 1 elif n in upper: uppercase += 1 else: other += 1 print("There are " + str(lowercase) + " lowercase letters.") print("There are " + str(uppercase) + " uppercase letters.") print("There are " + str(other) + " other elements to this sentence.") 

4 Comments

str.isalpha is much easier tho'
Any advantage over isalpha?
@Samuel isalpha works for various Unicode characters. This solution is not pretty but as far as I can determine the only solution that matches only the Latin alphabet that is also defined in ASCII.
you could write low and upper as strings and still do "if n in low". (at least in 3.9.13)
4

This works:

any(c.isalpha() for c in 'string') 

1 Comment

[c.isalpha() for c in '汉字'] is [True, True], while Han characters are typically not been considered as letters.
3

data = "abcdefg hi j 12345"

digits_count = 0 letters_count = 0 others_count = 0 for i in userinput: if i.isdigit(): digits_count += 1 elif i.isalpha(): letters_count += 1 else: others_count += 1 print("Result:") print("Letters=", letters_count) print("Digits=", digits_count) 

Output:

Please Enter Letters with Numbers: abcdefg hi j 12345 Result: Letters = 10 Digits = 5 

By using str.isalpha() you can check if it is a letter.

Comments

1

Easier way that considers only letters a-z and A-Z:

myString = "Hi!" for char in myString: if "a" <= char <= "z" or "A" <= char <= "Z": print(f"{char}: letter") else: print(f"{char}: not letter") 

Which gives output:

H: letter i: letter !: not letter 

Note that if "char" has multiple characters, this will only consider the first character.

Comments

0

If you want to test only a-z and A-Z (i.e. exclude 中 as valid), you can do:

def validate_word(word): """ Only allow a-z and A-Z only """ valid_chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'} if set(word).difference(valid_chars): print('there\'s at least 1 char that\'s not allowed') 

Haven't timed it but pretty using a set would be faster than iterating chars

Comments

-1

This works:

word = str(input("Enter string:")) notChar = 0 isChar = 0 for char in word: if not char.isalpha(): notChar += 1 else: isChar += 1 print(isChar, " were letters; ", notChar, " were not letters.") 

1 Comment

use is instead ==, if a is false

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.