Skip to main content

License: EUPL-1.2 PyPI: nxp PyPI: installs Documentation

NXP: Natural eXpression Parsing

NXP is a parsing library written in Python 3, inspired by pyparsing and Microsoft Monarch.

It allows users to do two things:

  • Define text patterns by combining Python objects, instead of writing complicated regular expressions.
  • Define and parse complex languages, with a simple dictionary!

Is it really that simple?
Don't take my word for it; see for yourself with the examples below, and the notebooks in the examples/ folder. :blush:

Examples

Matching HTML tags

This is a quick example to show how complex expressions are created in NXP, by combining Python objects.

from nxp import Seq, String, Either, Any, make_cursor

# property name, optionally assigned a value between quotes
attr = Seq( [r'\s+(\w+)', Seq([ r'\s*=\s*', String() ])], skip=1 )

# open/close tags, or self-closed tag
tag = Either(
    Seq( [r'<(\w+)', Any(attr), r'\s*/?>'] ), 
    r'</(\w+)\s*>'
)

# create cursor and find matches
cur = make_cursor('''
Not <a><tag</a>
<input type="checkbox" value="42" checked>
<img src="foo/bar.jpg" />
''')

for m in tag.find(cur,multi=True): print(m.insitu(cur.buffer))

output:

Not <a><tag</a>
    ---        
Not <a><tag</a>
           ----
<input type="checkbox" value="42" checked>
------------------------------------------
<img src="foo/bar.jpg" />
-------------------------

Parsing LaTeX-like commands

This is a quick example to illustrate parsing with NXP. We want to parse (very simplified) LaTeX-like patterns \command{ body } in the file foo.txt:

Inspirational quote:
\quote{
    Time you enjoy wasting is \it{not} wasted time.
}

Command without a body \command, or with an empty one \command{}.

This is how to define a language to match such patterns in NXP:

import nxp

# define these rules separately so they can be re-used
backslash = [ r'\\\\', ('rep','\\') ] 
command = [ r'\\(\w+)', ('open','command'), ('tag','cmd') ] 

# create a parser
parser = nxp.make_parser({
	'lang': {
		'main': [
			backslash,  # replace escaped backslashes
			command     # open "command" scope if we find something like '\word'
		],
		'command': { # the "command" scope
			'main': [
				[ r'\{', ('open','command.body'), ('tag','body') ],
					# open "body" subscope if command is followed by '{'
				[ None, 'close' ] 
					# otherwise close the scope
			],
			'body': [ # the "command.body" scope
				backslash,
				[ r'\\\{', ('rep','{') ],
				[ r'\\\}', ('rep','}') ],
					# deal with escapes before looking for a nested command
				command, 
					# look for nested commands
				[ r'\}', ('tag','/body'), ('close',2) ]
					# the command ends when the body ends: close both scopes
			]
		}
	}
})

print(nxp.parsefile( parser, 'foo.txt' ))

and the output is a simple AST:

Scope("main"): 3 element(s)
	[0] Scope("command"): 2 element(s)
		[0] (1, 0) - (1, 6) \quote
		[1] Scope("command.body"): 3 element(s)
			[0] (1, 6) - (1, 7) {
			[1] Scope("command"): 2 element(s)
				[0] (2, 30) - (2, 33) \it
				[1] Scope("command.body"): 2 element(s)
					[0] (2, 33) - (2, 34) {
					[1] (2, 37) - (2, 38) }
			[2] (3, 0) - (3, 1) }
	[1] Scope("command"): 1 element(s)
		[0] (5, 23) - (5, 31) \command
	[2] Scope("command"): 2 element(s)
		[0] (5, 54) - (5, 62) \command
		[1] Scope("command.body"): 2 element(s)
			[0] (5, 62) - (5, 63) {
			[1] (5, 63) - (5, 64) }

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nxp-0.3.1.tar.gz (27.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nxp-0.3.1-py3-none-any.whl (38.1 kB view details)

Uploaded Python 3

File details

Details for the file nxp-0.3.1.tar.gz.

File metadata

  • Download URL: nxp-0.3.1.tar.gz
  • Upload date:
  • Size: 27.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.6.8

File hashes

Hashes for nxp-0.3.1.tar.gz
Algorithm Hash digest
SHA256 49b6470ace8738dbc9e946196096c51fabb713f47dbeef08eb2db3197342f526
MD5 25f7af9b021840f573a970dd561fc86f
BLAKE2b-256 492eba1730f14ece6bc42b8d3a66271ab262430a71254022873d0b383e4e620c

See more details on using hashes here.

File details

Details for the file nxp-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: nxp-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 38.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.6.8

File hashes

Hashes for nxp-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5211ad10d39e21d7a080d7d3301af676f9f9d6076ad4e123669f7a6d85015d2f
MD5 0525ff8f28e00e7675bbc767e7dacfe8
BLAKE2b-256 d5c339d7f7865f35f040b253bd93e42f7f1e64cea92873b9517a591f9dcd1873

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

0.0.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page