demoji
Accurately find or remove emojis from a blob of text using data from the Unicode Consortium's emoji code repository.
Install
pip install demoji
# or, with uv:
uv add demoji
demoji supports Python 3.10 – 3.14 and bundles Unicode emoji data (version 16.0) at install time,
so no network access is required at runtime. See CHANGELOG.md for the full history.
To report a regression, please open a GitHub issue.
Basic Usage
demoji exports several text-related functions for find-and-replace functionality with emojis:
>>> tweet = """\
... #startspreadingthenews yankees win great start by 🎅🏾 going 5strong innings with 5k’s🔥 🐂
... solo homerun 🌋🌋 with 2 solo homeruns and👹 3run homerun… 🤡 🚣🏼 👨🏽⚖️ with rbi’s … 🔥🔥
... 🇲🇽 and 🇳🇮 to close the game🔥🔥!!!….
... WHAT A GAME!!..
... """
>>> demoji.findall(tweet)
{
"🔥": "fire",
"🌋": "volcano",
"👨🏽\u200d⚖️": "man judge: medium skin tone",
"🎅🏾": "Santa Claus: medium-dark skin tone",
"🇲🇽": "flag: Mexico",
"👹": "ogre",
"🤡": "clown face",
"🇳🇮": "flag: Nicaragua",
"🚣🏼": "person rowing boat: medium-light skin tone",
"🐂": "ox",
}
See below for function API.
Command-line Use
You can use demoji or python -m demoji to replace emojis
in file(s) or stdin with their :code: equivalents:
$ cat out.txt
All done! ✨ 🍰 ✨
$ demoji out.txt
All done! :sparkles: :shortcake: :sparkles:
$ echo 'All done! ✨ 🍰 ✨' | demoji
All done! :sparkles: :shortcake: :sparkles:
$ demoji -
we didnt start the 🔥
we didnt start the :fire:
Reference
findall(string: str) -> Dict[str, str]
Find emojis within string. Return a mapping of {emoji: description}.
findall_list(string: str, desc: bool = True) -> List[str]
Find emojis within string. Return a list (with possible duplicates).
If desc is True, the list contains description codes. If desc is False, the list contains emojis.
replace(string: str, repl: str = "") -> str
Replace emojis in string with repl.
replace_with_desc(string: str, sep: str = ":") -> str
Replace emojis in string with their description codes. The codes are surrounded by sep.
last_downloaded_timestamp() -> datetime.datetime
Show the timestamp of last download for the emoji data bundled with the package.
Footnote: Emoji Sequences
Numerous emojis that look like single Unicode characters are actually multi-character sequences. Examples:
- The keycap 2️⃣ is actually 3 characters, U+0032 (the ASCII digit 2), U+FE0F (variation selector), and U+20E3 (combining enclosing keycap).
- The flag of Scotland 7 component characters,
b'\\U0001f3f4\\U000e0067\\U000e0062\\U000e0073\\U000e0063\\U000e0074\\U000e007f'in full esaped notation.
(You can see any of these through s.encode("unicode-escape").)
demoji is careful to handle this and should find the full sequences rather than their incomplete subcomponents.
The way it does this it to sort emoji codes by their length, and then compile a concatenated regular expression that will greedily search for longer emojis first, falling back to shorter ones if not found. This is not by any means a super-optimized way of searching as it has O(N2) properties, but the focus is on accuracy and completeness.
>>> from pprint import pprint
>>> seq = """\
... I bet you didn't know that 🙋, 🙋♂️, and 🙋♀️ are three different emojis.
... """
>>> pprint(seq.encode('unicode-escape')) # Python 3
(b"I bet you didn't know that \\U0001f64b, \\U0001f64b\\u200d\\u2642\\ufe0f,"
b' and \\U0001f64b\\u200d\\u2640\\ufe0f are three different emojis.\\n')
Release files for demoji 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| demoji-2.0.0.tar.gz | 42.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| demoji-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 86.1 kB
Release files / demoji-2.0.0.tar.gz
| Download URL | demoji-2.0.0.tar.gz |
|---|---|
| Size | 42.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
570d34980588d6625867cda789973bc92f84b67ee9ef757cb877d37fa0d2a6ee
|
|
BLAKE2b-256 checksum How to use checksums |
49c1fd43225c9a87628c9885370ef203d37920f03dac231de58f2d09fb737cae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.
Transparency logRelease files / demoji-2.0.0-py3-none-any.whl
| Download URL | demoji-2.0.0-py3-none-any.whl |
|---|---|
| Size | 43.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
512e94aa0e828912ec55d441d92921a14233465317e6336a819deecac5d652ef
|
|
BLAKE2b-256 checksum How to use checksums |
53e3143672272e410bb131755c1d12d13e0e53e2235714c0b9ba358408911c4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.
Transparency log