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 confusables_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='ь.𝞂.ř.ɜ'>
print(reg.search('Hopefully you don\'t get bored easily'))
# prints None (bored has the word bore as a subset, but it is not a word on it's own)
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 0.1.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 | Provenance | Actions |
|---|---|---|---|---|
| confusables-0.1.0.tar.gz | 5.5 kB | Without provenance | Details for confusables-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| confusables-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for confusables-0.1.0-py3-none-any.whl |
Total release size: 13.9 kB
Release files / confusables-0.1.0.tar.gz
| Download URL | confusables-0.1.0.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aef65d4f62a499cf7573e068615ca26e3f9b7ef5fca671b391b11a23c408f1dd
|
|
BLAKE2b-256 checksum How to use checksums |
b6a085c35e0d92ebb103b823946d2772c18e24cd43e30a30ff6666a7004b0d60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.3
|
Release files / confusables-0.1.0-py3-none-any.whl
| Download URL | confusables-0.1.0-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
df8a23fbb932772a66da455a8e7f43bcbae528849afe9b553367f41eab499759
|
|
BLAKE2b-256 checksum How to use checksums |
ed36ab949f3bc21defa27d8f446867c6c9bb393917133666f9de90d2ea6125d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.3
|
Security for confusables 0.1.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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.