REAL — linear-time (ReDoS-safe) regex engine with an re-compatible API
Project description
REAL
Linear-time, ReDoS-safe C++20 regex with bounded lookarounds — RE2's safety plus the
lookarounds RE2 can't do — and a drop-in re-compatible Python binding.
Regular Expression Algorithmic Library — a header-only C++20 regex engine, constexpr
from end to end, with an re-compatible Python binding.
- Linear time, always. The engine is a Pike VM (Thompson NFA simulation): no backtracking, ReDoS-safe by construction.
- Constexpr-friendly. Patterns known at compile time are parsed, compiled and matched at compile time.
- Minimal memory. Static (sizes fixed at compile time, zero allocation), dynamic (storage sized exactly once at pattern compilation), or hybrid (compile-time pattern, runtime text, zero heap allocation).
- Zero dependencies. One include.
The problem
Backtracking engines — PCRE, std::regex, Python re — are vulnerable to ReDoS: a
pattern like (a+)+b takes exponential time on a hostile input. The linear-time engines
that fix this — RE2, Rust's regex — buy safety by dropping lookarounds entirely.
REAL gives you both: linear-time, ReDoS-safe matching with bounded lookarounds.
How it compares
| REAL | std::regex | RE2 / Rust | PCRE2-JIT | Python re | |
|---|---|---|---|---|---|
| Linear-time, ReDoS-safe | ✅ | ❌ | ✅ | ❌ | ❌ |
| Lookarounds | ✅ | ✅ | ❌ | ✅ | ✅ |
| Header-only, zero-dependency | ✅ | ✅¹ | ❌ | ❌ | — |
| Constexpr (compile-time match) | ✅ | ❌ | ❌ | ❌ | ❌ |
Drop-in Python re |
✅² | ❌ | ❌ | ❌ | ✅ |
| Raw throughput | fast | slow | ≈ REAL | fastest | slow |
¹ part of the C++ standard library. ² for the supported subset (no backreferences, etc.).
Throughput is qualitative — exact multipliers and methodology are in
BENCHMARKS.md.
Every other engine that has lookarounds backtracks (ReDoS-unsafe), and every linear-time engine drops them — REAL is the only one with both: bounded lookarounds and linear-time, ReDoS-safe matching.
ReDoS, in numbers
The classic catastrophic-backtracking pattern (a+)+b over "a"×N (no b, so no match):
| engine | input | time |
|---|---|---|
| REAL | N = 100 000 | 5.9 ms — linear |
| RE2 | N = 100 000 | 0.2 ms — linear |
std::regex |
N = 22 | refused — "complexity … exceeded a pre-set level" |
Python re |
n = 24 | 1118 ms — and climbing exponentially |
REAL and RE2 stay linear; the backtracking engines refuse or blow up at trivially small
inputs. These figures are from BENCHMARKS.md §C; they depend on the
platform, pattern and input, so reproduce them locally with make bench-engines rather than
trusting a number here.
Quickstart
Python — pip install real-regex, drop-in for the supported re subset:
import real as re # drop-in for the supported re subset
re.search(r"\d+", "x42") # -> a Match; findall / finditer / sub / split too
C++ — header-only, C++20:
find_package(real CONFIG REQUIRED)
target_link_libraries(app PRIVATE real::real)
#include <real/real.hpp>
real::regex re("[0-9]+");
re.search("x42").matched(); // true
More runnable programs — including the ReDoS demo — are in examples/.
Installation
| Channel | Command |
|---|---|
| PyPI (Python + headers) | pip install real-regex |
| Homebrew (macOS / Linux) | brew install RECHE23/sci/real-regex |
| vcpkg | via the vcpkg-sci registry → "dependencies": ["real-regex"] |
| CMake FetchContent | FetchContent_Declare(real GIT_REPOSITORY https://github.com/RECHE23/real-regex GIT_TAG v2026.6.18) |
| Vendored | copy include/ and compile with -std=c++20 -I include |
REAL is header-only, so "installing" just places the headers and the package metadata where a
consumer can find them. After cmake --install <build> --prefix <prefix>, there are three
ways to consume it from C++:
# 1. CMake — find_package against the installed config package:
find_package(real CONFIG REQUIRED)
target_link_libraries(app PRIVATE real::real)
# 2. pkg-config — for Make / Meson / autotools (and the system packagers):
c++ -std=c++20 $(pkg-config --cflags real) app.cpp -o app
# 3. Direct copy — vendor include/ into your tree, no build system needed:
c++ -std=c++20 -I/path/to/real/include app.cpp -o app
real::real is also available without installing, via add_subdirectory or FetchContent.
REAL requires C++20 or later. Every header asserts it (#include <real/...>
fails fast with a clear message under an older standard), and pkg-config has no
field to convey a language standard — so the consumer must pass -std=c++20 (or
newer) itself, as shown above.
The header-only library builds and installs with nothing but a C++20 compiler and
CMake. The SciForge test harness is needed
only to build the test suite (BUILD_TESTING=ON, the default for development
and CI), the Python binding and the CI scripts — never the library. Packagers
configure with -DBUILD_TESTING=OFF to install the library alone, with no
SciForge dependency.
The Homebrew formula consumes the library via CMake find_package(real),
pkg-config --cflags real, or -I"$(brew --prefix real-regex)/include" — see the
tap README for usage.
Documentation & benchmarks
- API reference (Doxygen, with embedded coverage): https://reche23.github.io/real-regex/
- Benchmarks — a measured baseline with the exact machine and engine versions:
BENCHMARKS.md
make bench-python compares throughput against Python's re, and
make bench-engines compares against std::regex, PCRE2 and RE2 in one C++
process (each engine's match counts are checked equal). Figures depend on the
platform, pattern and input; reproduce them locally rather than trusting a
number here.
Supported syntax
| Syntax | Meaning |
|---|---|
abc |
literal bytes (UTF-8 patterns match their UTF-8 bytes) |
\. \* \\ … |
escaped metacharacter, matched literally |
. |
any codepoint except \n |
[abc] [a-z] [^abc] [é] [à-ÿ] |
character class, ASCII and non-ASCII code-point members / ranges (str mode); [^…] matches any code point outside the set |
\w \W \d \D \s \S |
word / digit / space classes — Unicode in text mode (like re), ASCII in bytes mode or under a |
\n \t \r \f \v \a \0 \xHH |
control and hex escapes |
x* x+ x? |
quantifiers (greedy; append ? for lazy) |
x{n} x{n,} x{,m} x{n,m} |
counted repetition (greedy or lazy; counts capped at 1000) |
a|b |
alternation, leftmost branch preferred |
(…) (?:…) |
capturing / non-capturing group |
(?P<name>…) (?<name>…) |
named capturing group (Python and .NET styles) |
^ $ |
line/text anchors (Python semantics: $ also matches before a final \n) |
\A \Z |
strict text start / end |
\b \B |
word boundary / non-boundary (Unicode word characters in text mode, ASCII in bytes mode or under a) |
\< \> |
start / end of word (REAL extension, not in Python re) |
(?imsxa) prefix |
global flags: i case-insensitive (Unicode fold in text mode), m multiline, s dotall, x verbose (ignore unescaped whitespace and # comments outside classes), a ASCII (re.A: keep \w \W \d \D \s \S \b \B \< \> and icase folding ASCII, even in text mode) — also real::flags on the constructor |
Bounded lookarounds match in linear time: lookahead (?=...)/(?!...) and lookbehind
(?<=...)/(?<!...). Each sub-pattern must be length-bounded (an unbounded sub such as
(?=a*) is rejected) and is capture-free — groups inside a lookaround do not participate
in the result, a deliberate divergence from re. Lookbehind accepts any bounded
sub-pattern, including variable-width alternations such as (?<=a|bb), which re and PCRE
reject as non-fixed-width. static_regex does not accept lookarounds yet.
Unsupported syntax is rejected with real::regex_error rather than silently
diverging. Not yet: backreferences, atomic/possessive groups, Unicode property classes,
Unicode case folding.
Unicode model: matching is UTF-8 byte-based, but every construct consumes
whole codepoints (multi-byte sequences compile to byte-level alternatives), so
match boundaries never split a character. In str (code-point) mode a character
class carries specific non-ASCII code points and ranges ([é], [à-ÿ], [^é]),
compiled to the canonical UTF-8 automaton (never an overlong or surrogate
encoding); [^…], \D \W \S and . also match non-ASCII code points. Under
IGNORECASE, literals, classes and ranges do full Unicode case folding like
re (é matches É, k matches Kelvin). The \d \w \s shorthands and \b are
Unicode in text mode too (like re; ASCII under re.A / flags::ascii); a \xHH
escape keeps byte provenance and never folds. In bytes mode a class is raw bytes (a non-ASCII
member is a byte value, matching std::basic_regex<char>), and IGNORECASE folds
ASCII only.
Breaking / migration (UTF-8 / code-point mode). In str (code-point) mode, non-ASCII pattern text now decodes to whole code points instead of independent bytes. If you relied on the old byte behaviour:
- A raw non-ASCII literal is now one atom:
é+matcheséé(was:+on the last byte only). Usebytesmode for byte semantics.- A character class accepts non-ASCII members and ranges:
[é],[à-ÿ],[^é](was: a compile error).[^é]now means "any code point except é", not "any byte".\xHHis context-dependent: outside a class it is still the raw byte0xHH; inside a str-mode class[\xHH](HH ≥ 0x80) it is the code pointU+00HH.bytesmode is unchanged (raw bytes throughout) and remains a byte-for-bytestd::basic_regex<char>drop-in.
Divergence from Python: when a nullable loop body ends with an empty
iteration — e.g. (a*)* on "aa" — Python captures that final empty
iteration (''); REAL, like Perl/PCRE, keeps the last non-empty one ("aa").
Group 0 is identical either way.
Matching is linear in the input length: a Thompson NFA simulation (Pike VM)
with marked states, so a pattern such as (a+)+b cannot trigger exponential
backtracking. A literal prefilter and several whole-pattern fast paths
(literals, fixed-width sequences, ./negated-class runs, alternations of
straight-line branches) keep the constant factor low without leaving the
linear-time guarantee.
C++ API
#include <real/real.hpp>
real::regex rx("hello"); // runtime pattern, storage sized exactly once
rx.match("hello world"); // anchored at the start (Python re.match)
rx.fullmatch("hello"); // whole text (Python re.fullmatch)
rx.search("say hello"); // leftmost match anywhere (Python re.search)
match/fullmatch/search return a real::match_result: matched(),
operator bool, start(g), end(g), m[g] (a std::string_view into the
searched text, which must outlive the result), and the same accessors by group
name (m["year"], group_index).
for (auto& m : rx.find_iter(text)) { … } // lazy, Python finditer rules
rx.find_all(text); // eager vector<match_result>
rx.replace(text, "$2:$1"); // $&, $1…, ${name}, $$ — re.sub
rx.replace(text, "#", 2); // count limit
rx.split(text); // Python re.split, with groups
Empty matches follow Python's rules: they are yielded (even right after a
non-empty match) and the scan then advances one whole codepoint.
find_iter/find_all cannot be called on a temporary regex, and
match/search/split cannot take a temporary std::string.
Drop-in for std::regex
Already using <regex>? real::compat is a drop-in for the <regex> surface on the char path —
swap the include and alias the namespace, and your code keeps compiling:
#include <real/std/regex.hpp> // was: #include <regex>
namespace re = real::compat; // then re::regex / re::smatch / re::regex_search / …
It runs your pattern on REAL — linear-time, ReDoS-safe — wherever that is provably identical to
std::regex, and falls back to std::regex everywhere else: behave identically, never a silent
divergence. See the migration tour and
the full COMPATIBILITY.md.
Three memory modes
// Static: pattern compiled at compile time into exactly-sized constexpr
// arrays; an invalid pattern is a *compile error*.
constexpr real::static_regex<"(\\d{4})-(\\d{2})"> date;
static_assert(date.search("on 2026-06-10")[1] == "2026"); // constexpr match
// Hybrid: compile-time pattern, runtime text — matching performs zero heap
// allocations (state lives on the stack).
date.search(runtime_text);
// Dynamic: everything at runtime; the program is sized exactly once at
// compilation, match state is per-run scratch.
real::regex rx2(user_pattern, real::flags::icase);
DFA over a rule set (opt-in)
#include <real/dfa.hpp> // opt-in: not pulled in by <real/real.hpp>
const std::array patterns {real::regex("\\s+"), real::regex("[0-9]+"),
real::regex("[A-Za-z_][A-Za-z0-9_]*")};
real::dfa d(std::span<const real::regex>(patterns)); // built once, then immutable
auto hit = d.match("foo"); // -> {rule_index = 2, length = 3}; std::nullopt if none
real::dfa fuses a set of patterns into one capture-free, maximal-munch DFA: a
single left-to-right pass recognizes the winning rule (longest match; ties to the
earliest pattern; empty excluded) instead of running each pattern in turn — linear-time
and ReDoS-safe like the engine, built at run time and then immutable. It is the
accelerated rule dispatch a lexer wants (SciLex's dfa_modes is built on it). A pattern
carrying a zero-width assertion no DFA can represent ($, \b, multiline ^/$)
throws real::dfa_error; lazy and greedy accept the same language, so feed it
longest-match-faithful rules.
Python binding
An re-compatible module backed by the C++ engine (CPython Limited API, one
abi3 extension, zero dependencies):
import real
real.search(r"(?P<y>\d{4})-(?P<m>\d{2})", "on 2026-06-10").groupdict()
real.compile(r"\w+").findall(text) # findall/finditer/split/sub/subn
real.sub(r"\s+", " ", text) # templates: \1, \g<name>, callables
real.search(r"(\w+)=(\w+)", "k=v").expand(r"\2:\1") # Match.expand -> "v:k"
real.compile(rb"[^;]+").findall(raw) # bytes patterns: raw-byte semantics
str matching is UTF-8 with character indices in start/end/span; bytes
patterns get re's exact raw-byte semantics. Unsupported re features raise
real.error at compile time. Build with make python && make python-test.
pip install real-regex installs one cp310-abi3 wheel per platform
(CPython 3.10+; the self-contained sdist compiles where no wheel matches).
Embedding the C++ library through the Python package
The wheel also ships the C++ headers, so a project can compile against REAL
located through its Python install — the convention used by petsc4py and
slepc4py:
c++ -std=c++20 $(python -c "import real; print(real.get_include())") app.cpp
real.get_config() returns the version, the include directory and the
required C++ standard.
Releasing. Run make release. It computes the next calendar version
YYYY.M.PATCH — the patch resets each month, the first release of a month is
.0 (PEP 440 drops leading zeros, so 2026.6.1, never 2026.06.001) — bumps
it in pyproject.toml and python/real/__init__.py, then commits, tags and
pushes. The tag drives release.yml, which checks the tag matches the version,
builds abi3 wheels (cibuildwheel, Linux/macOS/Windows) and the sdist, and
publishes to PyPI via Trusted Publishing (OIDC, no stored secret). The pushed
tag is the single thing that triggers a publish.
Development
make help # list all targets
make test # build and run the test suite
make coverage # line coverage report (LLVM)
make sanitize # tests under ASan + UBSan
make lint # clang-tidy
make misra # MISRA C++:2023-oriented analysis
make fuzz # libFuzzer robustness fuzzing (clang)
make doc # API reference (Doxygen)
make format # Uncrustify, in place
make format-check # Uncrustify, dry-run; exits non-zero on diff
The API reference is published at https://reche23.github.io/real-regex/.
Select the compiler with make test CXX=g++-14. Every behaviour is tested at
runtime and in constexpr (static_assert) under Clang and GCC; an equivalence
suite checks the prefilter and fast paths never change results; a parity suite
and a randomized differential fuzzer compare Python outputs against re.
Coverage bar. REAL holds a high line-coverage bar (mid-90s on include/),
checked with make coverage. It deliberately does not adopt the
100%-on-all-four-dimensions (lines, functions, regions, and branches) gate used
by the SciLang-stack libraries built on top of it: as the oldest and most complex
engine here, its dual runtime/constexpr execution and Pike-VM branch structure
leave some regions and branches impractical to drive to 100% without contrived
tests. That lower-but-still-high bar is a deliberate, documented exception, not an
oversight — REAL keeps its own gate (above) and its broad public CI.
CI exercises:
| Platform | Architecture | Compiler |
|---|---|---|
| Linux | x86-64 | GCC, Clang |
| Linux | AArch64 | GCC |
| macOS | Apple Silicon (arm64) | Apple Clang |
| Windows | x86-64 | MSVC |
IntelLLVM (icpx), x86-64 macOS and the BSDs share the Clang flag set and are
supported by the build configuration but not exercised in CI.
License
MIT — Copyright (c) 2026 René Chenard
Author
René Chenard
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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file real_regex-2026.7.8.tar.gz.
File metadata
- Download URL: real_regex-2026.7.8.tar.gz
- Upload date:
- Size: 193.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d206351642849d77a6a691aefcfd6148ed66ead0b1b2cd8e2def67b7f2bb7543
|
|
| MD5 |
f03cfc0b0201ef061a56b15eb2e5a1c2
|
|
| BLAKE2b-256 |
4b2b638e3791a0a99cdff16f2cd4cfab2a4ab1c872cf6bd41ead836e3dcc33a5
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8.tar.gz:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8.tar.gz -
Subject digest:
d206351642849d77a6a691aefcfd6148ed66ead0b1b2cd8e2def67b7f2bb7543 - Sigstore transparency entry: 2063349173
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 426.2 kB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd0f35cfc5ce771c70640f121cf1484040a225244b3b6f667f2e6075490d0d82
|
|
| MD5 |
4aabd4d9a4b279675778307b253dd3bb
|
|
| BLAKE2b-256 |
a5f1880b6b7585a0c105c0f6c6a3bc0617d52961ad587db4a9aac5cf62085916
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-win_amd64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-win_amd64.whl -
Subject digest:
fd0f35cfc5ce771c70640f121cf1484040a225244b3b6f667f2e6075490d0d82 - Sigstore transparency entry: 2063350074
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-win32.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-win32.whl
- Upload date:
- Size: 418.1 kB
- Tags: CPython 3.10+, Windows x86
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea364c220d1aea08fa8edc2a614bcf84640cf6fb50376afd625289637a799e86
|
|
| MD5 |
7ba93e7bd55fb9125f9a6f23c9bfb8d3
|
|
| BLAKE2b-256 |
051601916ef8e544c041a8ca52cae0b1fcaff5346401cf86fa346d43d14b8090
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-win32.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-win32.whl -
Subject digest:
ea364c220d1aea08fa8edc2a614bcf84640cf6fb50376afd625289637a799e86 - Sigstore transparency entry: 2063349670
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b53959f532cc6dc2ccc2fb0ce5de6cfbd773d5df2e080314f3fa5543bfdb08c5
|
|
| MD5 |
8b29bedc7735cd576aa3e7ccb3e61155
|
|
| BLAKE2b-256 |
9a5fe39d6ece3db1ac56409ccac3e7cb9d484462aaf086cd95d6faaa50e31744
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-musllinux_1_2_x86_64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
b53959f532cc6dc2ccc2fb0ce5de6cfbd773d5df2e080314f3fa5543bfdb08c5 - Sigstore transparency entry: 2063349501
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c02bcb72c8e18140a0988917d041fc974418e6ff613aa3dbc89b264479feff42
|
|
| MD5 |
34068b52ed897fa7b61a8192578a320d
|
|
| BLAKE2b-256 |
2b1e2af98d509b1ce45d03628817ea793c217ae02faf803ae2f758c6aa401053
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-musllinux_1_2_aarch64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
c02bcb72c8e18140a0988917d041fc974418e6ff613aa3dbc89b264479feff42 - Sigstore transparency entry: 2063349929
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 968.9 kB
- Tags: CPython 3.10+, manylinux: glibc 2.24+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af1c4b6a63cc5e344be02d029811ce4cb72fd189587740ea1fa73b8ea389c2e5
|
|
| MD5 |
e409bb32b210e56b8165a9df34f37f0b
|
|
| BLAKE2b-256 |
c0240db46bc1b09d597d92db4bccaa4e8b516bd30421a830eabaee27e9765c74
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
af1c4b6a63cc5e344be02d029811ce4cb72fd189587740ea1fa73b8ea389c2e5 - Sigstore transparency entry: 2063350305
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 963.6 kB
- Tags: CPython 3.10+, manylinux: glibc 2.24+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a8cdf461dc8387d950e4145ab2fcaf08c1ca67648000b5d036a2a56e337cf97
|
|
| MD5 |
aec5264fa5304be033ac6ab7853eb694
|
|
| BLAKE2b-256 |
15677970f05471279a453baa9c5f063cb61f17a99a74cdf246fd335bb459dd33
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl -
Subject digest:
6a8cdf461dc8387d950e4145ab2fcaf08c1ca67648000b5d036a2a56e337cf97 - Sigstore transparency entry: 2063349785
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 237.7 kB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2dfa4ecac6434f6464123cd53f0eb6aa9be7b5e9037b563cbe5756ff360df1f
|
|
| MD5 |
e504f79b0bd38d3bd09c8cfdf4b001c8
|
|
| BLAKE2b-256 |
033df4d0786bb647025ed19f3e4fb3e60fd888170bfbcb1b6c0eeb9c3b312119
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
d2dfa4ecac6434f6464123cd53f0eb6aa9be7b5e9037b563cbe5756ff360df1f - Sigstore transparency entry: 2063350198
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file real_regex-2026.7.8-cp310-abi3-macosx_10_9_x86_64.whl.
File metadata
- Download URL: real_regex-2026.7.8-cp310-abi3-macosx_10_9_x86_64.whl
- Upload date:
- Size: 242.9 kB
- Tags: CPython 3.10+, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
def7f51972663ec7ae222c7c2384aa34d32dbc9026d67b331b4a729c60255d11
|
|
| MD5 |
3dfd7d041e4ed742a2f22886f86cc5f0
|
|
| BLAKE2b-256 |
492eb46b972c1bfe62d7b7f78fb4d684399806ac42b1dcd863e57d669687aa4f
|
Provenance
The following attestation bundles were made for real_regex-2026.7.8-cp310-abi3-macosx_10_9_x86_64.whl:
Publisher:
release.yml on RECHE23/real-regex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
real_regex-2026.7.8-cp310-abi3-macosx_10_9_x86_64.whl -
Subject digest:
def7f51972663ec7ae222c7c2384aa34d32dbc9026d67b331b4a729c60255d11 - Sigstore transparency entry: 2063349318
- Sigstore integration time:
-
Permalink:
RECHE23/real-regex@d34c0335df685fce34522acc3bb07d64636dfd34 -
Branch / Tag:
refs/tags/v2026.7.8 - Owner: https://github.com/RECHE23
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d34c0335df685fce34522acc3bb07d64636dfd34 -
Trigger Event:
push
-
Statement type: