Skip to content

Commit 3485edc

Browse files
committed
unix-ffe/re: Handle PCRE2_UNSET in group and groups methods.
Fixes: micropython/micropython#18877 Signed-off-by: Jos Verlinde <jos_verlinde@hotmail.com>
1 parent 6ae440a commit 3485edc

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

unix-ffi/re/re.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
# to -1
3939
PCRE2_ZERO_TERMINATED = -1
4040

41+
# PCRE2_UNSET is used for offsets of groups that didn't participate in a match
42+
# It's SIZE_MAX: 0xFFFFFFFF for 32bit, 0xFFFFFFFFFFFFFFFF for 64bit
43+
PCRE2_UNSET = (1 << (PCRE2_SIZE_SIZE * 8)) - 1
44+
4145

4246
IGNORECASE = I = 0x8
4347
MULTILINE = M = 0x400
@@ -62,12 +66,11 @@ def group(self, *n):
6266
if not n:
6367
return self.s[self.offsets[0] : self.offsets[1]]
6468
if len(n) == 1:
65-
return self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]]
66-
return tuple(self.s[self.offsets[i * 2] : self.offsets[i * 2 + 1]] for i in n)
69+
return None if self.offsets[n[0] * 2] == PCRE2_UNSET else self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]]
70+
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)
6771

6872
def groups(self, default=None):
69-
assert default is None
70-
return tuple(self.group(i + 1) for i in range(self.num - 1))
73+
return tuple(default if self.offsets[(i + 1) * 2] == PCRE2_UNSET else self.group(i + 1) for i in range(self.num - 1))
7174

7275
def start(self, n=0):
7376
return self.offsets[n * 2]

0 commit comments

Comments
 (0)