Releases: pyparsing/pyparsing
Pyparsing 3.3.2
-
Defined pyparsing-specific warning classes so that they can be selectively enabled or disabled without affecting warnings raised by other libraries in the same Python app:
PyparsingWarning- base warning for all pyparsing-specific warnings (inherits fromUserWarning)PyparsingDeprecationWarning- warning for using deprecated features (inherits fromPyparsingWarningandDeprecationWarning)PyparsingDiagnosticWarning- warning raised when pyparsing diagnostics are enabled and a diagnostic feature is used (inherits fromPyparsingWarning)
-
Added
as_datetimeparse action topyparsing.common- a more generalized version of theconvert_to_datetimeparse action (supports any expression that extracts date/time fields into "year", "month", "day", etc. results names), and validates that the parsed fields represent a valid date and time. -
Added
iso8601_date_validatedandiso8601_datetime_validatedexpressions topyparsing.common, which return a Pythondatetime.datetime -
Various performance improvements in
ParseResultsclass and core functions, with 10-20% performance overall. -
Added
regex_inverterweb page (using PyScript) to demonstrate using theinv_regex.pyexample. -
Expanded regex forms handled by the
examples/inv_regex.pyexample:- named capturing groups (
?P<name>) - partial repetition (
{m,}and{,n}) - negated character classes (
[^...])
- named capturing groups (
-
Added
SPy(Simplified Python) parser to examples.
Pyparsing 3.3.1
- Added license info to metadata, following PEP-639. Thanks to Gedalia Pasternak and Marc Mueller for submitted issue and PR. Fixes #626.
Pyparsing 3.3.0
=======================================================================================
The version 3.3.0 release will begin emitting DeprecationWarnings for pyparsing methods that have been renamed to PEP8-compliant names (introduced in pyparsing 3.0.0, in August, 2021, with legacy names retained as aliases). In preparation, I added in pyparsing 3.2.2 a utility for finding and replacing the legacy method names with the new names. This utility is located at pyparsing/tools/cvt_pep8_names.py. This script will scan all Python files specified on the command line, and if the -u option is selected, will replace all occurrences of the old method names with the new PEP8-compliant names, updating the files in place.
Here is an example that converts all the files in the pyparsing /examples directory:
python -m pyparsing.tools.cvt_pyparsing_pep8_names -u examples/*.py
The new names are compatible with pyparsing versions 3.0.0 and later.
=======================================================================================
-
Deprecated
indentedBlock, when converted using thecvt_pyparsing_pep8_namesutility, will emitUserWarningsthat additional code changes will be required. This is because the newIndentedBlockclass no longer requires the calling code to supply an indent stack, while adding support for nested indentation levels and grouping. -
Deprecated
locatedExpr, when converted using thecvt_pyparsing_pep8_namesutility, will emitUserWarningsthat additional code changes may be required. The newLocatedclass removes the extra grouping level of the parsed values. (If the originallocatedExprparser was defined with a results name, then the extra grouping is retained, so that the results name nesting works properly; in this case, no code changes would be required.) -
Updated all examples and test cases to use PEP8 names (unless the test case is specifically designed to test behavior of a legacy method). Added railroad diagrams for some examples.
-
Added exception handling when calling
formatted_message(), so thatstr(exception)always returns at least something. -
All unit tests pass with Python 3.14, including 3.14t. This does not necessarily mean that pyparsing is now thread-safe, just that when run in the free-threaded interpreter, there were no errors. None of the unit tests try to do any parsing with multiple threads - they test the basic functionality of the library, under various versions of packrat and left-recursive parsing.
-
Added AI instructions so that AI agents can be prompted with best practices for generating parsers using pyparsing code. These instructions are in the
ai/best_practices.mdfile, and can be accessed programmatically by callingpyparsing.show_best_practices()or runningpython -m pyparsing.ai.show_best_practicesfrom the command line, after installing thepyparsingpackage. -
Implemented a TINY language parser/interpreter using pyparsing, in the
examples/tinydirectory. This is a little tutorial language that I used to demonstrate how to use pyparsing to build a simple interpreter, following a recommended parser+AST+engine+run structure. Thedocssub-directory also includes transcripts of the AI session used to create the parser and the interpreter. Thesamplessub-directory includes a few sample TINY programs. -
Fixed minor formatting bugs in
pyparsing.testing.with_line_numbers, found during development of the TINY language example. -
Added test in
DelimitedListandnested_exprwhich auto-suppress delimiting commas to avoid wrapping in aSuppressif delimiter is already aSuppress. -
Added performance benchmarking tools and documentation:
tests/perf_pyparsing.pyruns a series of benchmark parsing tests, exercising different aspects of the pyparsing package. For cross-version analysis, this script can export results as CSV and append to a consolidated data file.- Runner scripts
run_perf_all_tags.bat(Windows) andrun_perf_all_tags.sh(Ubuntu/bash) execute the benchmark across multiple Python versions (3.9β3.14) and pyparsing versions (3.1.1 through 3.3.0), aggregating results intoperf_pyparsing.csvat the repo root. - See
tests/README.mdfor usage instructions.
-
Used performance benchmarking to identify and revert an inefficient utility method used in
transform_string(introduced in pyparsing 3.2.0b2).
Pyparsing 3.3.0b1
(added in 3.3.0b1)
-
Implemented a TINY language parser/interpreter using pyparsing, in the
examples/tinydirectory. This is a little tutorial language that I used to demonstrate how to use pyparsing to build a simple interpreter, following a recommended parser+AST+engine+run structure. The docs sub-directory also includes transcripts of the AI session used to create the parser and the interpreter. -
Fixed minor formatting bugs in pyparsing.testing.with_line_numbers, found during development of the TINY language example.
-
Added test in
DelimitedListandnested_exprwhich auto-suppress delimiting commas to avoid wrapping in aSuppressif delimiter is already aSuppress. -
Added performance benchmarking tools and documentation:
tests/perf_pyparsing.pyruns a series of benchmark parsing tests, exercising different aspects of the pyparsing package. For cross-version analysis, this script can export results as CSV and append to a consolidated data file.- Runner scripts
run_perf_all_tags.bat(Windows) andrun_perf_all_tags.sh(Ubuntu/bash) execute the benchmark across multiple Python versions (3.9β3.14) and pyparsing versions (3.1.1 through 3.3.0), aggregating results intoperf_pyparsing.csvat the repo root. - See
tests/README.mdfor usage instructions.
Pyparsing 3.3.0a1
- Supports Python 3.14 and free-threaded 3.14t. (Note: this does not mean that pyparsing is thread-safe, simply that pyparsing can safely run using the free-threaded build of Python.)
- The version 3.3.0 release will begin emitting
DeprecationWarningsfor pyparsing methods that have been renamed to PEP8-compliant names (introduced in pyparsing 3.0.0, in August, 2021, with legacy names retained as aliases). - AI instructions have been included for AI guidance when generating parsers using pyparsing. They can be accessed using
python -m pyparsing.ai.show_best_practices. - The
cvt_pyparsing_pep8_namesutility (released in pyparsing 3.2.2) will raise UserWarnings when convertinglocatedExprandindentedBlockcalls, since the new methods have slightly different call signatures and return types. - Source code examples have all been upgraded to use new PEP8-compliant names.
pyparsing 3.2.5
Barring any catastrophic bugs in this release, this will be the last release in the 3.2.x line. The next release, 3.3.0, will begin emitting DeprecationWarnings when the pre-PEP8 methods are used (see header notes in CHANGES file for more information, including available automation for converting any existing code using pyparsing using the old names).
- JINX! Well, 3.2.4 had a bug for
Wordexpressions that include a space character, if that expression was then copied, either directly with .copy() or by adding a results name, or including in another construct (likeDelimitedList) that makes a copy internally. Issue #618, reported by mstinberg, among others - thanks, and sorry for the inconvenience.
Full Changelog: 3.2.4...3.2.5
pyparsing 3.2.4
Barring any catastrophic bugs in this release, this will be the last release in the 3.2.x line. The next release, 3.3.0, will begin emitting DeprecationWarnings when the pre-PEP8 methods are used (see header notes above for more information, including available automation for converting any existing code using pyparsing with the old names).
-
Fixed bug when using a copy of a
Wordexpression (either by using the explicitcopy()method, or attaching a results name), and setting a new expression name, a raisedParseExceptionstill used the original expression name. Also affectedRegexexpressions withas_matchoras_group_list= True. Reported by Waqas Ilyas, in Issue #612 - good catch! -
Fixed type annotation for
replace_with, to acceptAnytype. Fixes Issue #602, reported by esquonk. -
Added locking around potential race condition in
ParserElement.reset_cache, as well as other cache-related methods. Fixes Issue #604, reported by CarlosDescalziIM. -
Substantial update to docstrings and doc generation in preparation for 3.3.0, great effort by FeRD, thanks!
-
Notable addition by FeRD to convert docstring examples to work with doctest! This was long overdue, thanks so much!
Pyparsing 3.2.3
- Fixed bug released in 3.2.2 in which
nested_exprcould overwrite parse actions for defined content, and could truncate list of items within a nested list. Fixes Issue #600, reported by hoxbro and luisglft, with helpful diag logs and repro code.
Pyparsing 3.2.2
The upcoming version 3.3.0 release will begin emitting DeprecationWarnings for pyparsing methods that have been renamed to PEP8-compliant names (introduced in pyparsing 3.0.0, in August, 2021, with legacy names retained as aliases). In preparation, I have added in pyparsing 3.2.2 a utility for finding and replacing the legacy method names with the new names. This utility is located at pyparsing/tools/cvt_pep8_names.py. This script will scan all Python files specified on the command line, and if the -u option is selected, will replace all occurrences of the old method names with the new PEP8-compliant names, updating the files in place.
Here is an example that converts all the files in the pyparsing /examples directory:
python -m pyparsing.tools.cvt_pyparsing_pep8_names -u examples/*.py
The new names are compatible with pyparsing versions 3.0.0 and later.
-
Released
cvt_pyparsing_pep8_names.pyconversion utility to upgrade pyparsing-based programs and libraries that use legacy camelCase names to use the new PEP8-compliant snake_case method names. The converter can also be imported into other scripts asfrom pyparsing.tools.cvt_pyparsing_pep8_names import pep8_converter -
Fixed bug in
nested_exprwhere nested contents were stripped of whitespace when the default whitespace characters were cleared (raised in this StackOverflow question https://stackoverflow.com/questions/79327649 by Ben Alan). Also addressed bug in resolving PEP8 compliant argument name and legacy argument name. -
Fixed bug in
rest_of_lineand the underlyingRegexclass, in which matching a pattern that could match an empty string (such as".*"or"[A-Z]*"would not raise aParseExceptionat or beyond the end of the input string. This could cause an infinite parsing loop when parsingrest_of_lineat the end of the input string. Reported by user Kylotan, thanks! (Issue #593) -
Enhancements and extra input validation for
pyparsing.util.make_compressed_re- see usage inexamples/complex_chemical_formulas.pyand result in the generated railroad diagramexamples/complex_chemical_formulas_diagram.html. Properly escapes characters like "." and "*" that have special meaning in regular expressions. -
Fixed bug in
one_of()to properly escape characters that are regular expression markers (such as '*', '+', '?', etc.) before building the internal regex. -
Better exception message for
MatchFirstandOrexpressions, showing all alternatives rather than just the first one. Fixes Issue #592, reported by Focke, thanks! -
Added return type annotation of "-> None" for all
__init__()methods, to satisfymypy --stricttype checking. PR submitted by FeRD, thank you! -
Added optional argument
show_hiddentocreate_diagramto show elements that are used internally by pyparsing, but are not part of the actual parser grammar. For instance, theTagclass can insert values into the parsed results but it does not actually parse any input, so by default it is not included in a railroad diagram. By callingcreate_diagramwithshow_hidden=True, these internal elements will be included. (You can see this in the tag_metadata.py script in the examples directory.) -
Fixed bug in
number_words.pyexample. Also addedebnf_number_words.pyto demonstrate using theebnf.pyEBNF parser generator to build a similar parser directly from EBNF. -
Fixed syntax warning raised in
bigquery_view_parser.py, invalid escape sequence "\s". Reported by sameer-google, nice catch! (Issue #598) -
Added support for Python 3.14.
Pyparsing 3.2.1
-
Updated generated railroad diagrams to make non-terminal elements links to their related sub-diagrams. This greatly improves navigation of the diagram, especially for large, complex parsers.
-
Simplified railroad diagrams emitted for parsers using
infix_notation, by hiding lookahead terms. Renamed internally generated expressions for clarity, and improved diagramming. -
Improved performance of
cpp_style_comment,c_style_comment,common.fnumberandcommon.ieee_floatRegex expressions. PRs submitted by Gabriel Gerlero,
nice work, thanks! -
Add missing type annotations to
match_only_at_col,replace_with,remove_quotes,with_attribute, andwith_class. Issue #585 reported by rafrafrek. -
Added generated diagrams for many of the examples.
-
Replaced old examples/0README.html file with examples/README.md file.