In .net you can use \p{L}
to match any letter, how can I do the same in Python? Namely, I want to match any uppercase, lowercase, and accented letters.

- 272,448
- 266
- 850
- 1,236
-
1See: http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties – Jeff Mercado Jun 11 '11 at 07:08
-
2You know that `'é'` [isn't a `unicode` in 2.x](http://farmdev.com/talks/unicode/), right? – Ignacio Vazquez-Abrams Jun 11 '11 at 07:46
-
@Ignacio/Tim: Oh! Right. Forgot about that! Thanks :D It's a little confusing because it doesn't throw an error or anything either. – mpen Jun 11 '11 at 17:09
2 Answers
Python's re
module doesn't support Unicode properties yet. But you can compile your regex using the re.UNICODE
flag, and then the character class shorthand \w
will match Unicode letters, too.
Since \w
will also match digits, you need to then subtract those from your character class, along with the underscore:
[^\W\d_]
will match any Unicode letter.
>>> import re
>>> r = re.compile(r'[^\W\d_]', re.U)
>>> r.match('x')
<_sre.SRE_Match object at 0x0000000001DBCF38>
>>> r.match(u'é')
<_sre.SRE_Match object at 0x0000000002253030>

- 328,213
- 58
- 503
- 561
-
Clever, but it doesn't seem to work. See update. I copied that e off of http://en.wikipedia.org/wiki/List_of_Unicode_characters, it doesn't seem to recognize it. – mpen Jun 11 '11 at 07:44
-
It works perfectly, but `'é'` is not an Unicode object, it's a string of bytes. – Rosh Oxymoron Jun 11 '11 at 07:48
-
-
-
1Python `re` doesn't but `regex` does, you can use `\p{L}` like you would in .net. – ales_t Jul 02 '19 at 14:18
PyPi regex module supports \p{L}
Unicode property class, and many more, see "Unicode codepoint properties, including scripts and blocks" section in the documentation and full list at http://www.unicode.org/Public/UNIDATA/PropList.txt. Using regex
module is convenient because you get consistent results across any Python version (mind that the Unicode standard is constantly evolving and the number of supported letters grows).
Install the library using pip install regex
(or pip3 install regex
) and use
\p{L} # To match any Unicode letter
\p{Lu} # To match any uppercase Unicode letter
\p{Ll} # To match any lowercase Unicode letter
\p{L}\p{M}* # To match any Unicode letter and any amount of diacritics after it
See some usage examples below:
import regex
text = r'Abc-++-Абв. It’s “Łąć”!'
# Removing letters:
print( regex.sub(r'\p{L}+', '', text) ) # => -++-. ’ “”!
# Extracting letter chunks:
print( regex.findall(r'\p{L}+', text) ) # => ['Abc', 'Абв', 'It', 's', 'Łąć']
# Removing all but letters:
print( regex.sub(r'\P{L}+', '', text) ) # => AbcАбвItsŁąć
# Removing all letters but ASCII letters:
print( regex.sub(r'[^\P{L}a-zA-Z]+', '', text) ) # => Abc-++-. It’s “”!
See a Python demo online

- 607,720
- 39
- 448
- 563
-
FYI, PiPy regex module also supports POSIX character classes and thus `[:alpha:]` (any letter), `[:lower:]` (all lowercase letters), and `[:upper:]` (to match all uppercase letters) can be used inside character classes to match various kinds of letters, too. Note that these POSIX character classes can be negated in a similar way as shorthand character classes. E.g. to match any char but a letter, you can use `[:^alpha:]`. The last `regex.sub` regex (`[^\P{L}a-zA-Z]+`) can be written as `[^[:^alpha:]a-zA-Z]+`. – Wiktor Stribiżew Jul 29 '21 at 07:33