From 40011ce8dbeb8d46cb59e392f0f93a4f86f93d82 Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Fri, 12 May 2023 14:17:22 +0300 Subject: [PATCH] utils.str: Handle \0 in perlReToReplacer It is required to use \g<0> as otherwise Python will process \0 as a 0 byte. --- src/utils/str.py | 3 ++- test/test_utils.py | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/utils/str.py b/src/utils/str.py index c9a86c21e..819202631 100644 --- a/src/utils/str.py +++ b/src/utils/str.py @@ -298,7 +298,8 @@ def perlReToReplacer(s): regexp = regexp.replace('\x08', r'\b') replace = replace.replace('\\'+sep, sep) for i in range(10): - replace = replace.replace(chr(i), r'\%s' % i) + replace = replace.replace(chr(i), r'\g<%s>' % i) + replace = replace.replace(r'\0', r'\g<0>') g = False if 'g' in flags: g = True diff --git a/test/test_utils.py b/test/test_utils.py index fdefea65e..8c3fcde8e 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -311,6 +311,10 @@ def testPerlReToReplacer(self): self.assertEqual(f('foo'), 'foo/bar') f = PRTR('s/^/foo/') self.assertEqual(f('bar'), 'foobar') + f = PRTR('s/bar/foo\0/') + self.assertEqual(f('bar'), 'foobar') + f = PRTR(r's/bar/foo\0/') + self.assertEqual(f('bar'), 'foobar') def testMultipleReplacer(self): replacer = utils.str.MultipleReplacer({'foo': 'bar', 'a': 'b'})