Skip to content

Commit aacb232

Browse files
committed
fix our group return logic to return None for unmatched groups
1 parent 8a02ded commit aacb232

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

graalpython/lib-graalpython/_sre.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,41 +66,50 @@ def __init__(self, pattern, pos, endpos, result):
6666
def end(self, groupnum=0):
6767
return self.result.end[groupnum]
6868

69-
def _groupidx(self, idx):
70-
if isinstance(idx, str):
71-
return self.compiled_regex.groups[idx]
72-
else:
73-
return idx
74-
7569
def group(self, *args):
7670
if not args:
77-
return self.result.input[self.result.start[0]:self.result.end[0]]
71+
return self.__group__(0)
7872
elif len(args) == 1:
79-
idxarg = self._groupidx(args[0])
80-
return self.result.input[self.result.start[idxarg]:self.result.end[idxarg]]
73+
return self.__group__(args[0])
8174
else:
8275
lst = []
8376
for arg in args:
84-
idxarg = self._groupidx(arg)
85-
lst.append(self.result.input[self.result.start[idxarg]:self.result.end[idxarg]])
77+
lst.append(self.__group__(arg))
8678
return tuple(lst)
8779

8880
def groups(self, default=None):
8981
lst = []
9082
for arg in range(1, self.result.groupCount):
91-
idxarg = self._groupidx(arg)
92-
lst.append(self.result.input[self.result.start[idxarg]:self.result.end[idxarg]])
83+
lst.append(self.__group__(arg))
9384
return tuple(lst)
9485

86+
def __groupidx__(self, idx):
87+
if isinstance(idx, str):
88+
return self.compiled_regex.groups[idx]
89+
else:
90+
return idx
91+
92+
def __group__(self, idx):
93+
idxarg = self.__groupidx__(idx)
94+
start = self.result.start[idxarg]
95+
if start < 0:
96+
return None
97+
else:
98+
return self.result.input[start:self.result.end[idxarg]]
99+
95100
def groupdict(self, default=None):
96-
return self.compiled_regex.groups
101+
d = {}
102+
for k in self.compiled_regex.groups:
103+
idx = self.compiled_regex.groups[k]
104+
d[k] = self.__group__(idx)
105+
return d
97106

98107
def span(self, groupnum=0):
99-
idxarg = self._groupidx(groupnum)
108+
idxarg = self.__groupidx__(groupnum)
100109
return (self.result.start[idxarg], self.result.end[idxarg])
101110

102111
def start(self, groupnum=0):
103-
idxarg = self._groupidx(groupnum)
112+
idxarg = self.__groupidx__(groupnum)
104113
return self.result.start[idxarg]
105114

106115
@property

0 commit comments

Comments
 (0)