Skip to main content

Build Status PyPI version

Confusables

Confusables is a python package that provides functionality for analyzing and matching words that "appear" to be the same or similar, but use different characters.

Confusables uses the unicode confusable characters list (https://www.unicode.org/Public/security/8.0.0/confusables.txt) along with other methods of matching characters.

This package can be used for any application where detecting words using any unexpected characters to pass filters is required. This could include finding malicious fake website names, analyzing or normalizing text data, or even detecting attempts to get past a profanity filter.

Installation

Confusables can be installed through pip using pip3 install confusables

Usage

The functions in the confusables module focus around comparing and finding strings that can be considered "confusable". This means that they can be humanly interpretable as the same string. Since this deals with human interpretation, the "confusable" definition is loose, and in later versions may be more or less strict.

Currently, confusables provides: is_confusable, confusable_characters, and confusable_regex

is_confusable(string1, string2) takes in 2 strings and outputs whether or not the two are "confusable". Keep in mind that in some cases, a single character can be confusable with 2 characters combined (eg. ‼ is a single character, !! is two)

from confusables import is_confusable

print(is_confusable('rover', 'Ʀỏ𝕍3ℛ'))
# prints True

confusable_characters(char) takes in a character and outputs a list of characters that are confusable with it. In some cases, as mentioned above, a single characters can be confusables with multiple characters, in which case those characters will be inluded in the list in the form of a string.

from confusables import confusable_characters

print(confusable_characters('c'))
# prints ['ċ', 'ᴄ', '𝔠', '𝒄', '𝗰', '𝗖', 'ḉ', 'ℂ', 'Ꮯ', 'ć', 'c̦', '𝑐', '𝓬', '𝚌', '𐌂', 'Ⅽ', 'С', '𝘤', 'c', 'ҫ', '𝖈', '🝌', '𝖢', '𝐂', 'C', '𝓒', 'Ç', '𝘾', 'ç', 'Ⲥ', 'с', 'ⅽ', 'ĉ', '𐔜', 'c', 'ℭ', 'ϲ', '𑣩', 'Ϲ', '𝕮', 'č', '𐊢', 'Ĉ', '𝑪', 'C', '𑣲', '𐐕', '𐐽', 'ⲥ', '𝐶', 'Ċ', 'C̦', 'ꮯ', '𝒞', '𝕔', '𝘊', 'Č', 'ꓚ', '𝒸', '𝐜', '𝙲', '𝖼', 'Ć', '𝙘', 'Ḉ']

confusable_regex(string, include_character_padding=False) takes a string and outputs a regex string that matches words that are confusable with the input string.

from confusables import confusable_regex
import re

regex_string = confusable_regex('bore', include_character_padding=True)
regex = re.compile(regex_string)

print(regex.search('Sometimes people say that life can be a ь.𝞂.ř.ɜ, but I don\'t agree'))
# prints <_sre.SRE_Match object; span=(40, 47), match='ь.𝞂.ř.ɜ'>

normalize(string, prioritize_alpha=False) takes a string and outputs a list of possible "normal forms". This means that characters in the string get converted to their confusable ascii counterparts. The prioritize_alpha option means the outputted options will prioritize converting characters to characters of the latin alphabet over any others. This option is recommended when natural language is expected.

from confusables import normalize

print(normalize('Ʀỏ𝕍3ℛ', prioritize_alpha=True))
# prints ['rov3r', 'rover']

print(normalize('Ʀỏ𝕍3ℛ', prioritize_alpha=False))
# prints ['r0v3r', 'r0ver', 'ro\'v3r', 'ro\'ver', 'rov3r', 'rover']

Updating to the latest Unicode confusables version

If you find the latest version of this package to have an out of date version of the unicode official confusables.txt, then why not submit a PR to update it!

First, find out what the latest version of unicode confusables is. Then, run

make update VERSION=X.Y.Z

Next, run

make parse

And that's it! Commit your changes and create a pull request.

About confusables

This module is something I put together because I'm interested in the field of language processing. I'm hoping to build out it's functionality, and I'm more than happy to take suggestions!

Additionally, I think the effectiveness of the module could be greatly improved using some machine learning models, and I'm currently on the hunt for some useful data sets. Please let me know if you know of any!

You can contact me through any normal Github means, or using my email, woodgern@gmail.com

Metadata

Release files for confusables 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for confusables 1.2.0
File Size Uploaded Provenance
confusables-1.2.0.tar.gz 262.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for confusables 1.2.0
File Interpreter ABI Platform
confusables-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 531.3 kB

Release files / confusables-1.2.0.tar.gz

Download URL confusables-1.2.0.tar.gz
Size 262.8 kB
Tags Source
SHA-256 checksum
How to use checksums
429caad05333832e1edabb80815704cd26530514369430f913002b2ba548c38e
BLAKE2b-256 checksum
How to use checksums
6624efd76375e69d309c0630d93345813740786bde7d86c3d3cfc97df5e829eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.5.0.1 requests/2.21.0 requests-toolbelt/0.9.1 tqdm/4.26.0 CPython/3.7.0

Release files / confusables-1.2.0-py3-none-any.whl

Download URL confusables-1.2.0-py3-none-any.whl
Size 268.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0c3e4a8ef8a6179f222e8cb6ea65ac5a71fa5c70d2de21950d14e99f933ecf52
BLAKE2b-256 checksum
How to use checksums
ea4d9cc11c3f2efa78809023b387c7304476e6e3c2a2342464fb9c259a39367b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.5.0.1 requests/2.21.0 requests-toolbelt/0.9.1 tqdm/4.26.0 CPython/3.7.0

Security for confusables 1.2.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page