Metadata-Version: 2.4
Name: Verbex
Version: 3.0.0
Summary: Python verbal based regular expressions
Author: R.Broderick
License-Expression: GPL-3.0-or-later
Project-URL: homepage, https://github.com/rbroderi/Verbex
Project-URL: documentation, https://rbroderi.github.io/Verbex/
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: beartype
Requires-Dist: regex>=2026.4.4
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: pytest-pretty; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: toml-sort; extra == "dev"
Requires-Dist: uv; extra == "dev"
Requires-Dist: validate-pyproject; extra == "dev"
Requires-Dist: tox; extra == "dev"
Requires-Dist: tox-pyenv-redux; extra == "dev"
Requires-Dist: pip-audit; extra == "dev"
Requires-Dist: pytest-sugar>=1.1.1; extra == "dev"
Requires-Dist: rust-just>=1.49.0; extra == "dev"
Requires-Dist: deptry>=0.25.1; extra == "dev"
Requires-Dist: prek>=0.3.8; extra == "dev"
Requires-Dist: detect-secrets>=1.5.0; extra == "dev"
Provides-Extra: optional
Provides-Extra: docs
Requires-Dist: Sphinx; extra == "docs"
Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
Requires-Dist: sphinx-rtd-theme; extra == "docs"
Requires-Dist: sphinx-rtd-size; extra == "docs"
Requires-Dist: autodocsumm; extra == "docs"
Requires-Dist: sphinx-pyproject; extra == "docs"
Dynamic: license-file

# Verbex: Python verbal based regular expressions

<!-- ![Build Status](https://github.com/rbroderi/Verbex/actions/workflows/main.yml/badge.svg?event=push) -->

<!-- [![GitHub License](https://img.shields.io/github/license/rbroderi/Verbex)](https://github.com/rbroderi/Verbex/blob/master/LICENSE) -->

[![Generic badge](https://img.shields.io/badge/license-GPL%E2%80%903.0-orange.svg)](https://github.com/rbroderi/Verbex/blob/master/LICENSE)
[![Code style: black](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![PyPI pyversions](https://img.shields.io/pypi/pyversions/verbex)](https://pypi.python.org/pypi/Verbex/)
[![Generic badge](https://img.shields.io/badge/mypy-typed-purple.svg)](http://mypy-lang.org/)
[![Generic badge](https://img.shields.io/badge/beartype-runtime_typed-cyan.svg)](https://github.com/beartype/beartype)
[![Generic badge](https://img.shields.io/badge/bandit-checked-magenta.svg)](https://bandit.readthedocs.io/en/latest/)
[![Generic badge](https://img.shields.io/badge/uv-requirements-yellow.svg)](https://github.com/astral-sh/uv)
[![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Frbroderi%2FVerbex%2Fmaster%2Fpyproject.toml&query=%24.project.version&label=Version)](https://github.com/rbroderi/Verbex/releases)

## Installation

```bash
pip install Verbex
```

## Notes

- Verbex now depends on the `regex` package (instead of Python's built-in `re` engine) for faster and more expressive pattern evaluation.
- Quantifier methods default to possessive mode for performance (`maybe`, `zero_or_more`, `one_or_more`, `n_times`, `n_times_or_more`, `n_to_m_times`, `anything`).
- If you need legacy backtracking behavior, pass `possessive=False`.
- You can set the default quantifier behavior once per expression with `Verbex(default_possessive=False)`.
- `OR(...)` alternates only against the most recently added fragment. Use `or_expr(...)` to alternate against the full expression.

## Usage

```python
from verbex import Verbex
verbex = Verbex()
```

## Documentation

[API](https://rbroderi.github.io/Verbex/)

## Examples

### Testing if we have a valid URL

```python
from verbex import Verbex

# Create an example of how to test for correctly formed URLs
verbex = Verbex()
tester = (verbex.
            start_of_line().
            find('http').
            maybe('s').
            find('://').
            maybe('www.').
            anything_but(' ').
            end_of_line()
)

# Create an example URL
test_url = "https://www.google.com"

# Test if the URL is valid
if tester.regex().fullmatch(test_url):
    print("Valid URL")

# Print the generated regex
print(tester)  # Example: ^http?+://(?:www\.)?+[^ ]+$
```

### Replacing strings

```python
from verbex import Verbex

# Create a test string
replace_me = "Replace bird with a duck"

# Create an expression that looks for the word "bird"
expression = Verbex().find('bird')

# Compile and use the regular expression
regexp = expression.regex()
result_re = regexp.sub('duck', replace_me)
print(result_re)
```

## Developer setup : running the tests

```bash
just tests
```

## Other implementations

You can view all implementations on [VerbalExpressions.github.io](http://VerbalExpressions.github.io)
