typehints/stdlib/re.pyi (36 lines of code) (raw):
"""
regular expressions.
Descriptions taken from:
https://raw.githubusercontent.com/micropython/micropython/master/docs/library/re.rst.
=======================================
.. module:: re
:synopsis: regular expressions
|see_cpython_module| :mod:`python:re`.
This module implements regular expression operations. Regular expression
syntax supported is a subset of CPython ``re`` module (and actually is
a subset of POSIX extended regular expressions).
Supported operators and special sequences are:
``.``
Match any character.
``[...]``
Match set of characters. Individual characters and ranges are supported,
including negated sets (e.g. ``[^a-c]``).
``^``
Match the start of the string.
``$``
Match the end of the string.
``?``
Match zero or one of the previous sub-pattern.
``*``
Match zero or more of the previous sub-pattern.
``+``
Match one or more of the previous sub-pattern.
``??``
Non-greedy version of ``?``, match zero or one, with the preference
for zero.
``*?``
Non-greedy version of ``*``, match zero or more, with the preference
for the shortest match.
``+?``
Non-greedy version of ``+``, match one or more, with the preference
for the shortest match.
``|``
Match either the left-hand side or the right-hand side sub-patterns of
this operator.
``(...)``
Grouping. Each group is capturing (a substring it captures can be accessed
with `match.group()` method).
``\d``
Matches digit. Equivalent to ``[0-9]``.
``\D``
Matches non-digit. Equivalent to ``[^0-9]``.
``\s``
Matches whitespace. Equivalent to ``[ \t-\r]``.
``\S``
Matches non-whitespace. Equivalent to ``[^ \t-\r]``.
``\w``
Matches "word characters" (ASCII only). Equivalent to ``[A-Za-z0-9_]``.
``\W``
Matches non "word characters" (ASCII only). Equivalent to ``[^A-Za-z0-9_]``.
``\``
Escape character. Any other character following the backslash, except
for those listed above, is taken literally. For example, ``\*`` is
equivalent to literal ``*`` (not treated as the ``*`` operator).
Note that ``\r``, ``\n``, etc. are not handled specially, and will be
equivalent to literal letters ``r``, ``n``, etc. Due to this, it's
not recommended to use raw Python strings (``r""``) for regular
expressions. For example, ``r"\r\n"`` when used as the regular
expression is equivalent to ``"rn"``. To match CR character followed
by LF, use ``"\r\n"``.
**NOT SUPPORTED**:
* counted repetitions (``{m,n}``)
* named groups (``(?P<name>...)``)
* non-capturing groups (``(?:...)``)
* more advanced assertions (``\b``, ``\B``)
* special character escapes like ``\r``, ``\n`` - use Python's own escaping
instead
* etc.
Example::
import re
# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")
regex.split("line1\rline2\nline3\r\n")
# Result:
# ['line1', 'line2', 'line3', '', '']
"""
__author__ = "Howard C Lovatt"
__copyright__ = "Howard C Lovatt, 2020 onwards."
__license__ = "MIT https://opensource.org/licenses/MIT (as used by MicroPython)."
__version__ = "7.3.0" # Version set by https://github.com/hlovatt/tag2ver
from typing import AnyStr, Callable, Generic, Final, Any
_StrLike: Final = str | bytes
def compile(regex_str: _StrLike, flags: int = ..., /) -> "ure":
"""
Compile regular expression, return `regex <regex>` object.
"""
def match(regex_str: _StrLike, string: AnyStr, /) -> "Match[AnyStr]":
"""
Compile *regex_str* and match against *string*. Match always happens
from starting position in a string.
"""
def search(regex_str: _StrLike, string: AnyStr, /) -> "Match[AnyStr]":
"""
Compile *regex_str* and search it in a *string*. Unlike `match`, this will search
string for first position which matches regex (which still may be
0 if regex is anchored).
"""
def sub(
regex_str: _StrLike,
replace: AnyStr | Callable[["Match[AnyStr]"], AnyStr],
string: AnyStr,
count: int = 0,
flags: int = 0,
/,
) -> AnyStr:
"""
Compile *regex_str* and search for it in *string*, replacing all matches
with *replace*, and returning the new string.
*replace* can be a string or a function. If it is a string then escape
sequences of the form ``\<number>`` and ``\g<number>`` can be used to
expand to the corresponding group (or an empty string for unmatched groups).
If *replace* is a function then it must take a single argument (the match)
and should return a replacement string.
If *count* is specified and non-zero then substitution will stop after
this many substitutions are made. The *flags* argument is ignored.
Note: availability of this function depends on :term:`MicroPython port`.
"""
DEBUG: Final[int] = ...
"""
Flag value, display debug information about compiled expression.
(Availability depends on :term:`MicroPython port`.)
"""
# noinspection PyPep8Naming
class ure:
"""
Compiled regular expression. Instances of this class are created using
`re.compile()`.
"""
def match(self, string: AnyStr, /) -> "Match[AnyStr]":
"""
Similar to the module-level functions :meth:`match`, :meth:`search`
and :meth:`sub`.
Using methods is (much) more efficient if the same regex is applied to
multiple strings.
"""
def search(self, string: AnyStr, /) -> "Match[AnyStr]":
"""
Similar to the module-level functions :meth:`match`, :meth:`search`
and :meth:`sub`.
Using methods is (much) more efficient if the same regex is applied to
multiple strings.
"""
def sub(
self,
replace: AnyStr | Callable[["Match[AnyStr]"], AnyStr],
string: AnyStr,
count: int = 0,
flags: int = 0,
/,
) -> AnyStr:
"""
Similar to the module-level functions :meth:`match`, :meth:`search`
and :meth:`sub`.
Using methods is (much) more efficient if the same regex is applied to
multiple strings.
"""
def split(self, string: AnyStr, max_split: int = -1, /) -> list[AnyStr]:
"""
Split a *string* using regex. If *max_split* is given, it specifies
maximum number of splits to perform. Returns list of strings (there
may be up to *max_split+1* elements if it's specified).
"""
class Match(Generic[AnyStr]):
"""
Match objects as returned by `match()` and `search()` methods, and passed
to the replacement function in `sub()`.
The name, `Match`, used for typing is not the same as the runtime name, `match` (note lowercase `m`).
The reason for this difference is that the runtime uses `match` as both a class name and as a method name and
this is not possible within code written entirely in Python and therefore not possible within typing code.
"""
def group(self, index: int, /) -> AnyStr:
"""
Return matching (sub)string. *index* is 0 for entire match,
1 and above for each capturing group. Only numeric groups are supported.
"""
def groups(self) -> tuple[AnyStr | Any, ...]:
"""
Return a tuple containing all the substrings of the groups of the match.
Note: availability of this method depends on :term:`MicroPython port`.
"""
def start(self, index: int = ..., /) -> int:
"""
Return the index in the original string of the start or end of the
substring group that was matched. *index* defaults to the entire
group, otherwise it will select a group.
Note: availability of these methods depends on :term:`MicroPython port`.
"""
def end(self, index: int = ..., /) -> int:
"""
Return the index in the original string of the start or end of the
substring group that was matched. *index* defaults to the entire
group, otherwise it will select a group.
Note: availability of these methods depends on :term:`MicroPython port`.
"""
def span(self, index: int = ..., /) -> tuple[int, int]:
"""
Returns the 2-tuple ``(match.start(index), match.end(index))``.
Note: availability of this method depends on :term:`MicroPython port`.
"""