Skip to content

Instantly share code, notes, and snippets.

@Saluev
Created December 10, 2023 17:17
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Saluev/604c9c3a3d6032770e15a0da143f73bd to your computer and use it in GitHub Desktop.
Save Saluev/604c9c3a3d6032770e15a0da143f73bd to your computer and use it in GitHub Desktop.
Emoji regular expression for Python
"""
Regular expressions for matching emoji sequences.
For parsing single emoji, use either
re.match(EMOJI_SEQUENCE, string)
# or
EMOJI_REGEXP.match(string)
To match multiple emojis or custom patterns, insert `EMOJI_SEQUENCE` into pattern:
re.match(rf"{EMOJI_SEQUENCE}+\s*...", string)
"""
import re
# https://www.unicode.org/Public/emoji/12.1/emoji-data.txt
EMOJI_CHARACTER = (
"["
"\u0023"
"\u002A"
"\u0030-\u0039"
"\u00A9"
"\u00AE"
"\u203C"
"\u2049"
"\u2122"
"\u2139"
"\u2194-\u2199"
"\u21A9-\u21AA"
"\u231A-\u231B"
"\u2328"
"\u23CF"
"\u23E9-\u23F3"
"\u23F8-\u23FA"
"\u24C2"
"\u25AA-\u25AB"
"\u25B6"
"\u25C0"
"\u25FB-\u25FE"
"\u2600-\u2604"
"\u260E"
"\u2611"
"\u2614-\u2615"
"\u2618"
"\u261D"
"\u2620"
"\u2622-\u2623"
"\u2626"
"\u262A"
"\u262E-\u262F"
"\u2638-\u263A"
"\u2640"
"\u2642"
"\u2648-\u2653"
"\u265F"
"\u2660"
"\u2663"
"\u2665-\u2666"
"\u2668"
"\u267B"
"\u267E"
"\u267F"
"\u2692-\u2694"
"\u2695"
"\u2696-\u2697"
"\u2699"
"\u269B-\u269C"
"\u26A0-\u26A1"
"\u26AA-\u26AB"
"\u26B0-\u26B1"
"\u26BD-\u26BE"
"\u26C4-\u26C5"
"\u26C8"
"\u26CE-\u26CF"
"\u26D1"
"\u26D3-\u26D4"
"\u26E9-\u26EA"
"\u26F0-\u26F5"
"\u26F7-\u26FA"
"\u26FD"
"\u2702"
"\u2705"
"\u2708-\u270D"
"\u270F"
"\u2712"
"\u2714"
"\u2716"
"\u271D"
"\u2721"
"\u2728"
"\u2733-\u2734"
"\u2744"
"\u2747"
"\u274C"
"\u274E"
"\u2753-\u2755"
"\u2757"
"\u2763-\u2764"
"\u2795-\u2797"
"\u27A1"
"\u27B0"
"\u27BF"
"\u2934-\u2935"
"\u2B05-\u2B07"
"\u2B1B-\u2B1C"
"\u2B50"
"\u2B55"
"\u3030"
"\u303D"
"\u3297"
"\u3299"
"\U0001F004"
"\U0001F0CF"
"\U0001F170-\U0001F171"
"\U0001F17E-\U0001F17F"
"\U0001F18E"
"\U0001F191-\U0001F19A"
"\U0001F1E6-\U0001F1FF"
"\U0001F201-\U0001F202"
"\U0001F21A"
"\U0001F22F"
"\U0001F232-\U0001F23A"
"\U0001F250-\U0001F251"
"\U0001F300-\U0001F321"
"\U0001F324-\U0001F393"
"\U0001F396-\U0001F397"
"\U0001F399-\U0001F39B"
"\U0001F39E-\U0001F3F0"
"\U0001F3F3-\U0001F3F5"
"\U0001F3F7-\U0001F4FD"
"\U0001F4FF-\U0001F53D"
"\U0001F549-\U0001F54E"
"\U0001F550-\U0001F567"
"\U0001F56F-\U0001F570"
"\U0001F573-\U0001F579"
"\U0001F57A"
"\U0001F587"
"\U0001F58A-\U0001F58D"
"\U0001F590"
"\U0001F595-\U0001F596"
"\U0001F5A4"
"\U0001F5A5"
"\U0001F5A8"
"\U0001F5B1-\U0001F5B2"
"\U0001F5BC"
"\U0001F5C2-\U0001F5C4"
"\U0001F5D1-\U0001F5D3"
"\U0001F5DC-\U0001F5DE"
"\U0001F5E1"
"\U0001F5E3"
"\U0001F5E8"
"\U0001F5EF"
"\U0001F5F3"
"\U0001F5FA-\U0001F64F"
"\U0001F680-\U0001F6C5"
"\U0001F6CB-\U0001F6D0"
"\U0001F6D1-\U0001F6D2"
"\U0001F6D5"
"\U0001F6E0-\U0001F6E5"
"\U0001F6E9"
"\U0001F6EB-\U0001F6EC"
"\U0001F6F0"
"\U0001F6F3"
"\U0001F6F4-\U0001F6F6"
"\U0001F6F7-\U0001F6F8"
"\U0001F6F9"
"\U0001F6FA"
"\U0001F7E0-\U0001F7EB"
"\U0001F90D-\U0001F90F"
"\U0001F910-\U0001F918"
"\U0001F919-\U0001F91E"
"\U0001F91F"
"\U0001F920-\U0001F927"
"\U0001F928-\U0001F92F"
"\U0001F930"
"\U0001F931-\U0001F932"
"\U0001F933-\U0001F93A"
"\U0001F93C-\U0001F93E"
"\U0001F93F"
"\U0001F940-\U0001F945"
"\U0001F947-\U0001F94B"
"\U0001F94C"
"\U0001F94D-\U0001F94F"
"\U0001F950-\U0001F95E"
"\U0001F95F-\U0001F96B"
"\U0001F96C-\U0001F970"
"\U0001F971"
"\U0001F973-\U0001F976"
"\U0001F97A"
"\U0001F97B"
"\U0001F97C-\U0001F97F"
"\U0001F980-\U0001F984"
"\U0001F985-\U0001F991"
"\U0001F992-\U0001F997"
"\U0001F998-\U0001F9A2"
"\U0001F9A5-\U0001F9AA"
"\U0001F9AE-\U0001F9AF"
"\U0001F9B0-\U0001F9B9"
"\U0001F9BA-\U0001F9BF"
"\U0001F9C0"
"\U0001F9C1-\U0001F9C2"
"\U0001F9C3-\U0001F9CA"
"\U0001F9CD-\U0001F9CF"
"\U0001F9D0-\U0001F9E6"
"\U0001F9E7-\U0001F9FF"
"\U0001FA70-\U0001FA73"
"\U0001FA78-\U0001FA7A"
"\U0001FA80-\U0001FA82"
"\U0001FA90-\U0001FA95"
"]"
)
EXTENDED_PICTOGRAPHIC_CHARACTER = (
"["
"\u00A9"
"\u00AE"
"\u203C"
"\u2049"
"\u2122"
"\u2139"
"\u2194-\u2199"
"\u21A9-\u21AA"
"\u231A-\u231B"
"\u2328"
"\u2388"
"\u23CF"
"\u23E9-\u23F3"
"\u23F8-\u23FA"
"\u24C2"
"\u25AA-\u25AB"
"\u25B6"
"\u25C0"
"\u25FB-\u25FE"
"\u2600-\u2604"
"\u2605"
"\u2607-\u260D"
"\u260E"
"\u260F-\u2610"
"\u2611"
"\u2612"
"\u2614-\u2615"
"\u2616-\u2617"
"\u2618"
"\u2619-\u261C"
"\u261D"
"\u261E-\u261F"
"\u2620"
"\u2621"
"\u2622-\u2623"
"\u2624-\u2625"
"\u2626"
"\u2627-\u2629"
"\u262A"
"\u262B-\u262D"
"\u262E-\u262F"
"\u2630-\u2637"
"\u2638-\u263A"
"\u263B-\u263F"
"\u2640"
"\u2641"
"\u2642"
"\u2643-\u2647"
"\u2648-\u2653"
"\u2654-\u265E"
"\u265F"
"\u2660"
"\u2661-\u2662"
"\u2663"
"\u2664"
"\u2665-\u2666"
"\u2667"
"\u2668"
"\u2669-\u267A"
"\u267B"
"\u267C-\u267D"
"\u267E"
"\u267F"
"\u2680-\u2685"
"\u2690-\u2691"
"\u2692-\u2694"
"\u2695"
"\u2696-\u2697"
"\u2698"
"\u2699"
"\u269A"
"\u269B-\u269C"
"\u269D-\u269F"
"\u26A0-\u26A1"
"\u26A2-\u26A9"
"\u26AA-\u26AB"
"\u26AC-\u26AF"
"\u26B0-\u26B1"
"\u26B2-\u26BC"
"\u26BD-\u26BE"
"\u26BF-\u26C3"
"\u26C4-\u26C5"
"\u26C6-\u26C7"
"\u26C8"
"\u26C9-\u26CD"
"\u26CE-\u26CF"
"\u26D0"
"\u26D1"
"\u26D2"
"\u26D3-\u26D4"
"\u26D5-\u26E8"
"\u26E9-\u26EA"
"\u26EB-\u26EF"
"\u26F0-\u26F5"
"\u26F6"
"\u26F7-\u26FA"
"\u26FB-\u26FC"
"\u26FD"
"\u26FE-\u2701"
"\u2702"
"\u2703-\u2704"
"\u2705"
"\u2708-\u270D"
"\u270E"
"\u270F"
"\u2710-\u2711"
"\u2712"
"\u2714"
"\u2716"
"\u271D"
"\u2721"
"\u2728"
"\u2733-\u2734"
"\u2744"
"\u2747"
"\u274C"
"\u274E"
"\u2753-\u2755"
"\u2757"
"\u2763-\u2764"
"\u2765-\u2767"
"\u2795-\u2797"
"\u27A1"
"\u27B0"
"\u27BF"
"\u2934-\u2935"
"\u2B05-\u2B07"
"\u2B1B-\u2B1C"
"\u2B50"
"\u2B55"
"\u3030"
"\u303D"
"\u3297"
"\u3299"
"\U0001F000-\U0001F003"
"\U0001F004"
"\U0001F005-\U0001F0CE"
"\U0001F0CF"
"\U0001F0D0-\U0001F0FF"
"\U0001F10D-\U0001F10F"
"\U0001F12F"
"\U0001F16C-\U0001F16F"
"\U0001F170-\U0001F171"
"\U0001F17E-\U0001F17F"
"\U0001F18E"
"\U0001F191-\U0001F19A"
"\U0001F1AD-\U0001F1E5"
"\U0001F201-\U0001F202"
"\U0001F203-\U0001F20F"
"\U0001F21A"
"\U0001F22F"
"\U0001F232-\U0001F23A"
"\U0001F23C-\U0001F23F"
"\U0001F249-\U0001F24F"
"\U0001F250-\U0001F251"
"\U0001F252-\U0001F2FF"
"\U0001F300-\U0001F321"
"\U0001F322-\U0001F323"
"\U0001F324-\U0001F393"
"\U0001F394-\U0001F395"
"\U0001F396-\U0001F397"
"\U0001F398"
"\U0001F399-\U0001F39B"
"\U0001F39C-\U0001F39D"
"\U0001F39E-\U0001F3F0"
"\U0001F3F1-\U0001F3F2"
"\U0001F3F3-\U0001F3F5"
"\U0001F3F6"
"\U0001F3F7-\U0001F3FA"
"\U0001F400-\U0001F4FD"
"\U0001F4FE"
"\U0001F4FF-\U0001F53D"
"\U0001F546-\U0001F548"
"\U0001F549-\U0001F54E"
"\U0001F54F"
"\U0001F550-\U0001F567"
"\U0001F568-\U0001F56E"
"\U0001F56F-\U0001F570"
"\U0001F571-\U0001F572"
"\U0001F573-\U0001F579"
"\U0001F57A"
"\U0001F57B-\U0001F586"
"\U0001F587"
"\U0001F588-\U0001F589"
"\U0001F58A-\U0001F58D"
"\U0001F58E-\U0001F58F"
"\U0001F590"
"\U0001F591-\U0001F594"
"\U0001F595-\U0001F596"
"\U0001F597-\U0001F5A3"
"\U0001F5A4"
"\U0001F5A5"
"\U0001F5A6-\U0001F5A7"
"\U0001F5A8"
"\U0001F5A9-\U0001F5B0"
"\U0001F5B1-\U0001F5B2"
"\U0001F5B3-\U0001F5BB"
"\U0001F5BC"
"\U0001F5BD-\U0001F5C1"
"\U0001F5C2-\U0001F5C4"
"\U0001F5C5-\U0001F5D0"
"\U0001F5D1-\U0001F5D3"
"\U0001F5D4-\U0001F5DB"
"\U0001F5DC-\U0001F5DE"
"\U0001F5DF-\U0001F5E0"
"\U0001F5E1"
"\U0001F5E2"
"\U0001F5E3"
"\U0001F5E4-\U0001F5E7"
"\U0001F5E8"
"\U0001F5E9-\U0001F5EE"
"\U0001F5EF"
"\U0001F5F0-\U0001F5F2"
"\U0001F5F3"
"\U0001F5F4-\U0001F5F9"
"\U0001F5FA-\U0001F64F"
"\U0001F680-\U0001F6C5"
"\U0001F6C6-\U0001F6CA"
"\U0001F6CB-\U0001F6D0"
"\U0001F6D1-\U0001F6D2"
"\U0001F6D3-\U0001F6D4"
"\U0001F6D5"
"\U0001F6D6-\U0001F6DF"
"\U0001F6E0-\U0001F6E5"
"\U0001F6E6-\U0001F6E8"
"\U0001F6E9"
"\U0001F6EA"
"\U0001F6EB-\U0001F6EC"
"\U0001F6ED-\U0001F6EF"
"\U0001F6F0"
"\U0001F6F1-\U0001F6F2"
"\U0001F6F3"
"\U0001F6F4-\U0001F6F6"
"\U0001F6F7-\U0001F6F8"
"\U0001F6F9"
"\U0001F6FA"
"\U0001F6FB-\U0001F6FF"
"\U0001F774-\U0001F77F"
"\U0001F7D5-\U0001F7DF"
"\U0001F7E0-\U0001F7EB"
"\U0001F7EC-\U0001F7FF"
"\U0001F80C-\U0001F80F"
"\U0001F848-\U0001F84F"
"\U0001F85A-\U0001F85F"
"\U0001F888-\U0001F88F"
"\U0001F8AE-\U0001F8FF"
"\U0001F90C"
"\U0001F90D-\U0001F90F"
"\U0001F910-\U0001F918"
"\U0001F919-\U0001F91E"
"\U0001F91F"
"\U0001F920-\U0001F927"
"\U0001F928-\U0001F92F"
"\U0001F930"
"\U0001F931-\U0001F932"
"\U0001F933-\U0001F93A"
"\U0001F93C-\U0001F93E"
"\U0001F93F"
"\U0001F940-\U0001F945"
"\U0001F947-\U0001F94B"
"\U0001F94C"
"\U0001F94D-\U0001F94F"
"\U0001F950-\U0001F95E"
"\U0001F95F-\U0001F96B"
"\U0001F96C-\U0001F970"
"\U0001F971"
"\U0001F972"
"\U0001F973-\U0001F976"
"\U0001F977-\U0001F979"
"\U0001F97A"
"\U0001F97B"
"\U0001F97C-\U0001F97F"
"\U0001F980-\U0001F984"
"\U0001F985-\U0001F991"
"\U0001F992-\U0001F997"
"\U0001F998-\U0001F9A2"
"\U0001F9A3-\U0001F9A4"
"\U0001F9A5-\U0001F9AA"
"\U0001F9AB-\U0001F9AD"
"\U0001F9AE-\U0001F9AF"
"\U0001F9B0-\U0001F9B9"
"\U0001F9BA-\U0001F9BF"
"\U0001F9C0"
"\U0001F9C1-\U0001F9C2"
"\U0001F9C3-\U0001F9CA"
"\U0001F9CB-\U0001F9CC"
"\U0001F9CD-\U0001F9CF"
"\U0001F9D0-\U0001F9E6"
"\U0001F9E7-\U0001F9FF"
"\U0001FA00-\U0001FA6F"
"\U0001FA70-\U0001FA73"
"\U0001FA74-\U0001FA77"
"\U0001FA78-\U0001FA7A"
"\U0001FA7B-\U0001FA7F"
"\U0001FA80-\U0001FA82"
"\U0001FA83-\U0001FA8F"
"\U0001FA90-\U0001FA95"
"\U0001FA96-\U0001FFFD"
"]"
)
DEFAULT_EMOJI_PRESENTATION_CHARACTER = (
"["
"\u231A-\u231B"
"\u23E9-\u23EC"
"\u23F0"
"\u23F3"
"\u25FD-\u25FE"
"\u2614-\u2615"
"\u2648-\u2653"
"\u267F"
"\u2693"
"\u26A1"
"\u26AA-\u26AB"
"\u26BD-\u26BE"
"\u26C4-\u26C5"
"\u26CE"
"\u26D4"
"\u26EA"
"\u26F2-\u26F3"
"\u26F5"
"\u26FA"
"\u26FD"
"\u2705"
"\u270A-\u270B"
"\u2728"
"\u274C"
"\u274E"
"\u2753-\u2755"
"\u2757"
"\u2795-\u2797"
"\u27B0"
"\u27BF"
"\u2B1B-\u2B1C"
"\u2B50"
"\u2B55"
"\U0001F004"
"\U0001F0CF"
"\U0001F18E"
"\U0001F191-\U0001F19A"
"\U0001F1E6-\U0001F1FF"
"\U0001F201"
"\U0001F21A"
"\U0001F22F"
"\U0001F232-\U0001F236"
"\U0001F238-\U0001F23A"
"\U0001F250-\U0001F251"
"\U0001F300-\U0001F320"
"\U0001F32D-\U0001F335"
"\U0001F337-\U0001F37C"
"\U0001F37E-\U0001F393"
"\U0001F3A0-\U0001F3CA"
"\U0001F3CF-\U0001F3D3"
"\U0001F3E0-\U0001F3F0"
"\U0001F3F4"
"\U0001F3F8-\U0001F43E"
"\U0001F440"
"\U0001F442-\U0001F4FC"
"\U0001F4FF-\U0001F53D"
"\U0001F54B-\U0001F54E"
"\U0001F550-\U0001F567"
"\U0001F57A"
"\U0001F595-\U0001F596"
"\U0001F5A4"
"\U0001F5FB-\U0001F64F"
"\U0001F680-\U0001F6C5"
"\U0001F6CC"
"\U0001F6D0"
"\U0001F6D1-\U0001F6D2"
"\U0001F6D5"
"\U0001F6EB-\U0001F6EC"
"\U0001F6F4-\U0001F6F6"
"\U0001F6F7-\U0001F6F8"
"\U0001F6F9"
"\U0001F6FA"
"\U0001F7E0-\U0001F7EB"
"\U0001F90D-\U0001F90F"
"\U0001F910-\U0001F918"
"\U0001F919-\U0001F91E"
"\U0001F91F"
"\U0001F920-\U0001F927"
"\U0001F928-\U0001F92F"
"\U0001F930"
"\U0001F931-\U0001F932"
"\U0001F933-\U0001F93A"
"\U0001F93C-\U0001F93E"
"\U0001F93F"
"\U0001F940-\U0001F945"
"\U0001F947-\U0001F94B"
"\U0001F94C"
"\U0001F94D-\U0001F94F"
"\U0001F950-\U0001F95E"
"\U0001F95F-\U0001F96B"
"\U0001F96C-\U0001F970"
"\U0001F971"
"\U0001F973-\U0001F976"
"\U0001F97A"
"\U0001F97B"
"\U0001F97C-\U0001F97F"
"\U0001F980-\U0001F984"
"\U0001F985-\U0001F991"
"\U0001F992-\U0001F997"
"\U0001F998-\U0001F9A2"
"\U0001F9A5-\U0001F9AA"
"\U0001F9AE-\U0001F9AF"
"\U0001F9B0-\U0001F9B9"
"\U0001F9BA-\U0001F9BF"
"\U0001F9C0"
"\U0001F9C1-\U0001F9C2"
"\U0001F9C3-\U0001F9CA"
"\U0001F9CD-\U0001F9CF"
"\U0001F9D0-\U0001F9E6"
"\U0001F9E7-\U0001F9FF"
"\U0001FA70-\U0001FA73"
"\U0001FA78-\U0001FA7A"
"\U0001FA80-\U0001FA82"
"\U0001FA90-\U0001FA95"
"]"
)
TEXT_PRESENTATION_SELECTOR = "[\uFE0E]"
TEXT_PRESENTATION_SEQUENCE = f"(?:{EMOJI_CHARACTER}{TEXT_PRESENTATION_SELECTOR})"
EMOJI_PRESENTATION_SELECTOR = "[\uFE0F]"
EMOJI_PRESENTATION_SEQUENCE = f"(?:{EMOJI_CHARACTER}{EMOJI_PRESENTATION_SELECTOR})"
EMOJI_MODIFIER = "[\U0001F3FB-\U0001F3FF]"
EMOJI_MODIFIER_BASE = (
"["
"\u261D"
"\u26F9"
"\u270A-\u270D"
"\U0001F385"
"\U0001F3C2-\U0001F3C4"
"\U0001F3C7"
"\U0001F3CA-\U0001F3CC"
"\U0001F442-\U0001F443"
"\U0001F446-\U0001F450"
"\U0001F466-\U0001F478"
"\U0001F47C"
"\U0001F481-\U0001F483"
"\U0001F485-\U0001F487"
"\U0001F48F"
"\U0001F491"
"\U0001F4AA"
"\U0001F574-\U0001F575"
"\U0001F57A"
"\U0001F590"
"\U0001F595-\U0001F596"
"\U0001F645-\U0001F647"
"\U0001F64B-\U0001F64F"
"\U0001F6A3"
"\U0001F6B4-\U0001F6B6"
"\U0001F6C0"
"\U0001F6CC"
"\U0001F90F"
"\U0001F918"
"\U0001F919-\U0001F91E"
"\U0001F91F"
"\U0001F926"
"\U0001F930"
"\U0001F931-\U0001F932"
"\U0001F933-\U0001F939"
"\U0001F93C-\U0001F93E"
"\U0001F9B5-\U0001F9B6"
"\U0001F9B8-\U0001F9B9"
"\U0001F9BB"
"\U0001F9CD-\U0001F9CF"
"\U0001F9D1-\U0001F9DD"
"]"
)
EMOJI_MODIFIER_SEQUENCE = f"{EMOJI_MODIFIER_BASE}{EMOJI_MODIFIER}"
REGIONAL_INDICATOR = "[\U0001F1E6-\U0001F1FF]"
EMOJI_FLAG_SEQUENCE = f"{REGIONAL_INDICATOR}{2}"
TAG_BASE = f"(?:{EMOJI_MODIFIER_SEQUENCE}|{EMOJI_PRESENTATION_SEQUENCE}|{EMOJI_CHARACTER})"
TAG_SPEC = "[\U000E0020-\U000E007E]"
TAG_END = "\U000E007F"
EMOJI_TAG_SEQUENCE = f"(?:{TAG_BASE}{TAG_SPEC}{TAG_END})"
EMOJI_KEYCAP_SEQUENCE = "(?:[0-9#*]\uFE0F\u20E3)"
EMOJI_CORE_SEQUENCE = (
f"(?:"
f"{EMOJI_PRESENTATION_SEQUENCE}|"
f"{EMOJI_KEYCAP_SEQUENCE}|"
f"{EMOJI_MODIFIER_SEQUENCE}|"
f"{EMOJI_FLAG_SEQUENCE}|"
f"{EMOJI_CHARACTER}"
f")"
)
EMOJI_ZWJ_ELEMENT = f"(?:{EMOJI_CORE_SEQUENCE}|{EMOJI_TAG_SEQUENCE})"
ZWJ = "\u200d"
EMOJI_ZWJ_SEQUENCE = f"(?:{EMOJI_ZWJ_ELEMENT}(?:{ZWJ}{EMOJI_ZWJ_ELEMENT})+)"
# http://www.unicode.org/reports/tr51/
EMOJI_SEQUENCE = f"(?:{EMOJI_CORE_SEQUENCE}|{EMOJI_ZWJ_SEQUENCE}|{EMOJI_TAG_SEQUENCE})"
EMOJI_REGEXP = re.compile(EMOJI_SEQUENCE)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment