From 3485edc81d4d4627c3045d92a9b12ed36813952e Mon Sep 17 00:00:00 2001 From: Jos Verlinde Date: Sat, 28 Feb 2026 23:24:29 +0100 Subject: [PATCH 1/2] unix-ffe/re: Handle PCRE2_UNSET in group and groups methods. Fixes: https://github.com/micropython/micropython/issues/18877 Signed-off-by: Jos Verlinde --- unix-ffi/re/re.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/unix-ffi/re/re.py b/unix-ffi/re/re.py index bd9566cb9..bf108686a 100644 --- a/unix-ffi/re/re.py +++ b/unix-ffi/re/re.py @@ -38,6 +38,10 @@ # to -1 PCRE2_ZERO_TERMINATED = -1 +# PCRE2_UNSET is used for offsets of groups that didn't participate in a match +# It's SIZE_MAX: 0xFFFFFFFF for 32bit, 0xFFFFFFFFFFFFFFFF for 64bit +PCRE2_UNSET = (1 << (PCRE2_SIZE_SIZE * 8)) - 1 + IGNORECASE = I = 0x8 MULTILINE = M = 0x400 @@ -62,12 +66,11 @@ def group(self, *n): if not n: return self.s[self.offsets[0] : self.offsets[1]] if len(n) == 1: - return self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]] - return tuple(self.s[self.offsets[i * 2] : self.offsets[i * 2 + 1]] for i in n) + return None if self.offsets[n[0] * 2] == PCRE2_UNSET else self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]] + return tuple(None if self.offsets[i * 2] == PCRE2_UNSET else self.s[self.offsets[i * 2] : self.offsets[i * 2 + 1]] for i in n) def groups(self, default=None): - assert default is None - return tuple(self.group(i + 1) for i in range(self.num - 1)) + return tuple(default if self.offsets[(i + 1) * 2] == PCRE2_UNSET else self.group(i + 1) for i in range(self.num - 1)) def start(self, n=0): return self.offsets[n * 2] From 8cbb7ad4e246beab3b8c819927f84a188367d141 Mon Sep 17 00:00:00 2001 From: Jos Verlinde Date: Sun, 1 Mar 2026 21:45:31 +0100 Subject: [PATCH 2/2] unix-ffi/re: Add test for empty string match in ffi regex. Signed-off-by: Jos Verlinde --- unix-ffi/re/test_re.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unix-ffi/re/test_re.py b/unix-ffi/re/test_re.py index e58e8b8b8..481c85224 100644 --- a/unix-ffi/re/test_re.py +++ b/unix-ffi/re/test_re.py @@ -60,3 +60,6 @@ text = " \thello there\n \t how are you?" indents = _leading_whitespace_re.findall(text) assert indents == [" \t", " \t "] + +m = re.match(r"(.)?", "") +assert m.groups() == (None,)