extmod/modre: Add support for start- and endpos.

Pattern objects have two additional parameters for the ::search and ::match
methods to define the starting and ending position of the subject within
the string to be searched.

This allows for searching a sub-string without creating a slice.  However,
one caveat of using the start-pos rather than a slice is that the start
anchor (`^`) remains anchored to the beginning of the text.

Signed-off-by: Jared Hancock <jared@greezybacon.me>
This commit is contained in:
Jared Hancock
2024-03-25 20:58:51 -05:00
committed by Damien George
parent 485dac783b
commit 14ccdeb4d7
3 changed files with 114 additions and 3 deletions

View File

@@ -0,0 +1,78 @@
# test start and end pos specification
try:
import re
except ImportError:
print("SKIP")
raise SystemExit
def print_groups(match):
print("----")
try:
if match is not None:
i = 0
while True:
print(match.group(i))
i += 1
except IndexError:
pass
p = re.compile(r"o")
m = p.match("dog")
print_groups(m)
m = p.match("dog", 1)
print_groups(m)
m = p.match("dog", 2)
print_groups(m)
# No match past end of input
m = p.match("dog", 5)
print_groups(m)
m = p.match("dog", 0, 1)
print_groups(m)
# Caret only matches the actual beginning
p = re.compile(r"^o")
m = p.match("dog", 1)
print_groups(m)
# End at beginning means searching empty string
p = re.compile(r"o")
m = p.match("dog", 1, 1)
print_groups(m)
# End before the beginning doesn't match anything
m = p.match("dog", 2, 1)
print_groups(m)
# Negative starting values don't crash
m = p.search("dog", -2)
print_groups(m)
m = p.search("dog", -2, -5)
print_groups(m)
# Search also works
print("--search")
p = re.compile(r"o")
m = p.search("dog")
print_groups(m)
m = p.search("dog", 1)
print_groups(m)
m = p.search("dog", 2)
print_groups(m)
# Negative starting values don't crash
m = p.search("dog", -2)
print_groups(m)
m = p.search("dog", -2, -5)
print_groups(m)