🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Sign inDemoInstall
Socket

pcre2

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pcre2

Python bindings for the PCRE2 regular expression library

0.4.0
PyPI
Maintainers
1

PCRE2.py: Python bindings for the PCRE2 regular expression library

This project contains Python bindings for PCRE2. PCRE2 is the revised API for the Perl-compatible regular expressions (PCRE) library created by Philip Hazel. For original source code, see the official PCRE2 repository.

Installation

From PyPI:

pip install pcre2

If a wheel is not available for your platform, the module will be built from source. Building requires:

  • cmake
  • C compiler toolchain, such as gcc and make
  • libtool
  • Python headers

Usage

This library aims to be compatible with Python's built-in re module. In many cases, this means that pcre2 can drop-in replace re to gain some performance (see benchmarks below). However, PCRE2 and Python implement different regex specifications, so patterns and behavior will not always be translatable (e.g., the syntax for group replacement differs).

Regular expressions are compiled with pcre2.compile() which accepts both unicode strings and bytes-like objects. This returns a Pattern object. Expressions can be compiled with a number of options (combined with the bitwise-or operator) and can be JIT compiled,

>>> import pcre2
>>> expr = r'(?<head>\w+)\s+(?<tail>\w+)'
>>> patn = pcre2.compile(expr, flags=pcre2.I, jit=True)
>>> # Patterns can also be JIT compiled after initialization.
>>> patn.jit_compile()

Inspection of Pattern objects is done as follows,

>>> patn.jit
True
>>> patn.groupindex
{'head': 1, 'tail': 2}
>>> patn.flags
<CompileOption.IGNORECASE: 8>

Once compiled, Pattern objects can be used to match against strings. Matching return a Match object, which has several functions to view results,

>>> subj = 'foo bar buzz bazz'
>>> match = patn.match(subj)
>>> match[0]
'foo bar'
>>> match.span()
(0, 7)

Substitution is also supported, both from Pattern and Match objects,

>>> repl = '$2 $1'
>>> patn.sub(repl, subj) # Global substitutions by default.
'bar foo bazz buzz'
>>> patn.sub(repl, subj, count=1)
'bar foo buzz bazz'
>>> match.expand(repl)
'bar foo'

Additionally, Pattern objects support scanning over subjects for all non-overlapping matches,

>>> for match in patn.finditer(subj):
...     print(match.group('head'))
...
foo
buzz

Performance

PCRE2 provides a fast regular expression library, particularly with JIT compilation enabled. Below are the regex-redux benchmark results included in this repository,

ScriptNumber of runsTotal timeReal timeUser timeSystem time
baseline.py103.2300.3230.0200.100
re_vanilla.py1051.0905.10911.3750.530
pcre2_vanilla.py1021.9802.1983.1540.483
pcre2_optimized.py1014.8601.4862.5200.548
cffi_optimized.py1014.1301.4133.1110.411

Script descriptions are as follows,

ScriptDescription
baseline.pyReads input file and outputs stored expected output
re_vanilla.pyPure Python version
re_vanilla.pySame as re_vanilla.py, with pcre2 drop-in replacing re
pcre2_module.pyMore optimized implementation using pcre2
cffi_optimized.pyManually written Python ctypes bindings for shared PCRE2 C library

Tests were performed on an M2 Macbook Air. Note that to run benchmarks locally, Git LFS must be installed to download the input dataset. Additionally, a Python virtual environment must be created, and the package built with make init and make build respectively. For more information on this benchmark, see The Computer Language Benchmarks Game. See source code of benchmark scripts for details and original sources.

FAQs

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts