Python Pattern Matching
Project description
How to install
pip install pypama
Presentation
This package provides a pattern matching for list of objects. Just as Regex provides regular expression for strings, this package provides regular expression for other type of lists.
An example is worth a thousand words: assume you have a list
>>> example_list = ['a', 'a', 1, '', None, 'b', 'c', 'e']
For some reason, you know that there is an int and a None, and you want to extract that number and the 2 strings following the None
>>> from pypama import build_pattern, is_int, is_none
>>> g = build_pattern((~is_int).star(False), '(', is_int, ')', '.*', is_none, '(',ANY,ANY, ')')
>>> g.match(example_list).groups()
[[1], ['b', 'c']]
~is_int will matching anything that’s not an integer
.star(False): equivalent to *? in regular expressions: repeat as many as necessary
parenthesis are for capturing groups
.* is short for ANY.star() (match anything, repeatedly)
Therefore the pattern above reads as follow: match anything that’s not an int, repeatedly, until you find an int that you capture in group 1. Then match anything until you find a None. That must be followed by two elements that you capture in group 2.
This is therefore very similar to the re package, but applied to a list and with matching that goes beyond strings.
Usage
build_pattern(*args, **functions) where args is a list of strings or Pattern objects, and functions maps function names to executable.
- The args can be a string or a list of strings containing:
<string>: will match the string inside <>
callable unction: X will match if function(X) returns True
X?: will be ignored or match X
X*: will match if X matches repeatedly (greedy)
X*?: will match if X matches repeatedly (non greedy)
(X): will capture the X in a group
(P<name>X): will capture X in a group named “name”
X|Y: will match if X or Y matches
\n: will match the nth group previously matched
<r:X>: will match if the word matches regexp X
<re:X>: same as <r:X>
<c:function> or <call:function>: will match if function(X) matches. If function does not exist in the namespace of pypama, add the definition in the function call eg build_pattern('<c:foo>', foo=lambda x:x<2) will match [1]
. will match any item
$ will match if at the end of the list
X{n} will match X exactly n times. n can be a list of integer
X!: will match if the item doesn’t match X (X must match exactly 1 element)
- Both are equally valid and evaluate to the same result;
build_pattern('<hello>','<world>','.*')
build_pattern('<hello><world>.*')
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file pypama-1.1.tar.gz.
File metadata
- Download URL: pypama-1.1.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.5.0.1 requests/2.18.4 setuptools/38.4.0 requests-toolbelt/0.8.0 tqdm/4.32.1 CPython/3.6.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efe66ce774afd35add9b91fa1600716118d4c8ad44bf49ffc05053c0f97a3c6a
|
|
| MD5 |
7b3882de1b37d3f41814b38ee69bc80a
|
|
| BLAKE2b-256 |
980ff4817eff671c038a4420cab5dd5e28423e7877429f9977eb9cc16fe8c463
|