Package: edify
Edify (/ˈɛdɪfaɪ/, “ed-uh-fahy”) is a Python library that allows you to easily create regular expressions for matching text in a programmatically-friendly way. It is designed to be used in conjunction with theremodule.It also allows you to verify a string quickly by providing commonly used regex patterns in its extensive set of built-in patterns. To tap into a pattern, simply import the pattern function from theedify.librarymodule.Quick StartTo get started make sure you have python 3.7 or later installed and then, install Edify frompip:pipinstalledifyYou can also install the in-development version with:pipinstallhttps://github.com/luciferreeves/edify/archive/main.zipThen go on to import theRegexBuilderclass from theedifymodule.Using Pre-Built PatternsThe following example recognises and captures any email likeemail@example.com.fromedify.libraryimportemailemail_addr="email@example.com"assertemail(email_addr)==TrueBuilding Regex Example: Validating 16-bit Hexadecimal NumberThe following example recognises and captures the value of a 16-bit hexadecimal number like0xC0D3.fromedifyimportRegexBuilderexpr=(RegexBuilder().start_of_input().optional().string("0x")# match an optional "0x" string.capture().exactly(4).any_of()# let x = any characters between (a-f, A-F, and 0-9).range("A","F")# now capture exactly 4 such groups of "x".range("a","f")# this will give the match for the number like "C0D3".range("0","9")# which when combined with "0x" becomes a 16-bit hexadecimal number.end().end().end_of_input().to_regex()# used to convert to `re` compatible form)"""
Produces the following regular expression:
re.compile(^(?:0x)?([A-Fa-f0-9]{4})$)

Using `to_regex_string()` instead of `to_regex()` at the end
will give the compiled regex string.
"""assertexpr.match("0xC0D3")Building Regex Example: Validating Signed IntegerThe following example recognises and checks if a number is a valid signed integer or not (eg.-45or+45).fromedifyimportRegexBuilder# expression for matching any signed integer. compiles to '^[\+\-]{1}\d+$'expr=(RegexBuilder().start_of_input().exactly(1).any_of()# capture either '+' or '-', exactly once.char('+').char('-').end().one_or_more().digit()# capture any number of digits.end_of_input().to_regex())ifexpr.match('-69'):print("Matched")# prints matchedBuilding Regex Example: Simple URL ValidatorThe following example checks if a string is a valid url in the form ofhttps://www.example.com/path/to/file.extfromedifyimportRegexBuilder# expression for validating URLsvalidate_urls=(RegexBuilder().optional().string('http://')# look for an optional "http://".optional().string('https://')# or "https://".one_or_more().any_of()# let x = any characters between (a-z, 0-9, '-', and '.').range('a','z')# now capture one or more groups of "x".range('0','9')# essentially capturing all url patterns in the form of.any_of_chars('.-')# xxx.yyyyyyy.abra-cadabra.com.end().at_least(2).any_of()# this is to make sure we get at least 2 characters in.range('a','z')# the end of the string, which would be our domain.end().zero_or_more().any_of().range('a','z')# same logic as capturing the url in step 1, but now.range('0','9')# we are essentially looking for an optional path.any_of_chars('/.-_%')# and we add some more characters supported in path.end())# compiles to '^(?:http://)?(?:https://)?([a-z0-9\\.]+[a-z]{2,}[a-z0-9/\\.\\-_%]*)$'expr=(RegexBuilder().ignore_case()# case does not matter.subexpression(validate_urls)# directly writing the subexpression works too.to_regex()# convert to regex finally)ifexpr.match('https://SOMETHING.www.exam-ple.com/path/to/file.txt'):print("Matched")# prints matchedBuilding Regex Example: Simple Password ValidatorThe regular expression below cheks that a password:Has minimum 8 characters in length.At least one uppercase English letter.At least one lowercase English letter.At least one digit.At least one special character from#?!@$%^&*-.fromedifyimportRegexBuilder# expression for validating passwords - complies to '^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$'expr=(RegexBuilder().start_of_input()# asserts position at start of a line.assert_ahead()# positive look ahead# matches any character in range 'A' to 'Z' zero and unlimited times,# as few times as possible, expanding as needed (lazy) - matching at least 1 uppercase character.zero_or_more_lazy().any_char().range('A','Z').end().assert_ahead()# at least 1 lowercase character.zero_or_more_lazy().any_char().range('a','z').end().assert_ahead()# at least 1 number.zero_or_more_lazy().any_char().range('0','9').end().assert_ahead()# at least 1 special character present in the list.zero_or_more_lazy().any_char().any_of_chars('#?!@$%^&*-').end().at_least(8).any_char()# must be at least 8 characters long.end_of_input().to_regex())ifexpr.match('-Secr3t!'):print("Matched")# prints matchedFurther DocumentationFurther API documentation is available onedify.rftd.io.Why Edify?Regex is a powerful tool, but its syntax is not very intuitive and can be difficult to build, understand, and use. It gets even more difficult when you have to deal with backtracking, look-ahead, and other features that make regex difficult.That’s where Edify becomes extremely useful. It allows you to create regular expressions in a programmatic way by invoking theRegexBuilderclass[1]. The API uses thefluent builder pattern, and is completely immutable. It is built to be discoverable and predictable.Properties and methods describe what they do in plain English.Order matters! Quantifiers are specified before the thing they change, just like in English (e.g.RegexBuilder().exactly(5).digit()).If you make a mistake, you’ll know how to fix it. Edify will guide you towards a fix if your expression is invalid.subexpressionscan be used to create meaningful, reusable components.Edify turns those complex and unwieldy regexes that appear in code reviews into something that can be read, understood, andproperly reviewedby your peers - and maintained by anyone!License & ContributingThis project is licensed underApache Software License 2.0. SeeContributing Guidelinesfor information on how to contribute to this project.ContributorsFootnotes[1]RegexBuilderclass based on theSuperExpressivelibrary.Changelog0.2.2 (2022-12-22)Added Support for Python 3.11Added more RegexBuilder ExamplesFixed Documentation Typos0.2.1 (2022-11-27)This is a Quick Fix Release to fix the incomplete release of 0.2.0. The release was intended to drop support for 3.6, but the metadata was not updated to reflect this. This release fixes that. v0.2.0 remains available on PyPI, but is incompatible with Python 3.6. Using it with other versions of Python is not a problem. Other than the metadata, the two releases are identical.0.2.0 (2022-11-27)This is a minor release with a few new built-in validators along with some small changes and bug fixes.Validators added:URL ValidatorUUID ValidatorGUID ValidatorSSN ValidatorMac Address (IEEE 802) ValidatorZip Code ValidatorPassword ValidatorDocumentation:Added documentation for new validatorsAdd warning for trade-offs in email regex validationBug Fixes:Fixed Phone pattern failing for service numbers and 4 digit numbers (See#16for more information)0.1.0 (2022-09-10)First release on PyPI.