|
1 | 1 | from dataclasses import dataclass |
2 | | -from typing import Self |
| 2 | +from typing import TYPE_CHECKING |
3 | 3 |
|
| 4 | +if TYPE_CHECKING: |
| 5 | + from .pattern import Pattern |
4 | 6 |
|
5 | | -@dataclass |
| 7 | + |
| 8 | +@dataclass(repr=False) |
6 | 9 | class Match: |
7 | | - span: tuple[int, int] |
| 10 | + re: "Pattern" |
| 11 | + pos: int | None |
| 12 | + endpos: int | None |
8 | 13 | match: str |
| 14 | + groupspandict: dict[int, tuple[int, int]] |
| 15 | + |
| 16 | + def group(self, *indices: int) -> (str | None) | tuple[str | None, ...]: |
| 17 | + match len(indices): |
| 18 | + case 0: |
| 19 | + return self._group(0) |
| 20 | + case 1: |
| 21 | + return self._group(indices[0]) |
| 22 | + case _: |
| 23 | + return tuple(map(self._group, indices)) |
| 24 | + |
| 25 | + def _group(self, i: int) -> str | None: |
| 26 | + start, end = self.span(i) |
| 27 | + if start == -1: |
| 28 | + return None |
| 29 | + else: |
| 30 | + match_start = self.start() |
| 31 | + return self.match[start - match_start : end - match_start] |
| 32 | + |
| 33 | + def groupdict(self) -> dict[int, str | None]: |
| 34 | + return {i: self._group(i) for i in self.groupspandict} |
| 35 | + |
| 36 | + def span(self, i: int = 0) -> tuple[int, int]: |
| 37 | + return self.groupspandict.get(i, (-1, -1)) |
| 38 | + |
| 39 | + def start(self, i: int = 0) -> int: |
| 40 | + return self.span(i)[0] |
| 41 | + |
| 42 | + def end(self, i: int = 0) -> int: |
| 43 | + return self.span(i)[1] |
| 44 | + |
| 45 | + def __getitem__(self, i: int) -> str | None: |
| 46 | + return self._group(i) |
9 | 47 |
|
10 | | - @classmethod |
11 | | - def from_span_and_text(cls, start: int, end: int, text: str) -> Self: |
12 | | - return cls((start, end), text[start:end]) |
| 48 | + @property |
| 49 | + def string(self) -> str: |
| 50 | + return self.re.pattern |
13 | 51 |
|
14 | | - def group(self) -> str: |
15 | | - return self.match |
| 52 | + def __repr__(self) -> str: |
| 53 | + return f"<Match span={self.span()!r}, match={self.match!r}>" |
0 commit comments