From 319437d4bd7c97ab18275d3eaf1bc190554f9df7 Mon Sep 17 00:00:00 2001 From: Andrew Leech Date: Fri, 25 Sep 2020 12:27:02 +1000 Subject: [PATCH] extmod/modure: Allow \\ in re.sub replacements. --- extmod/modure.c | 3 +++ tests/extmod/ure_sub.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/extmod/modure.c b/extmod/modure.c index 328c897d88..220587b42f 100644 --- a/extmod/modure.c +++ b/extmod/modure.c @@ -343,6 +343,9 @@ STATIC mp_obj_t re_sub_helper(size_t n_args, const mp_obj_t *args) { const char *end_match = match->caps[match_no * 2 + 1]; vstr_add_strn(&vstr_return, start_match, end_match - start_match); } + } else if (*repl == '\\') { + // Add the \ character + vstr_add_byte(&vstr_return, *repl++); } } else { // Just add the current byte from the replacement string diff --git a/tests/extmod/ure_sub.py b/tests/extmod/ure_sub.py index 953e7bf62a..ae6ad28d62 100644 --- a/tests/extmod/ure_sub.py +++ b/tests/extmod/ure_sub.py @@ -43,6 +43,9 @@ print( ) ) +# \g immediately followed by another \g +print(re.sub("(abc)", r"\g<1>\g<1>", "abc")) + # no matches at all print(re.sub("a", "b", "c")) @@ -69,3 +72,6 @@ try: re.sub(123, "a", "a") except TypeError: print("TypeError") + +# Include \ in the sub replacement +print(re.sub("b", "\\\\b", "abc"))