def preg_replace(args, executer, local): global USING_PCRE # mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) pattern, replacement, subject = [executer.get_val(x) for x in args[:3]] limit = 0 if len(args) < 4 else executer.get_val(args[3]) count_ref = None if len(args) < 5 else args[4] # print dict(zip('pattern,replacement,subject'.split(','), [pattern, replacement, subject])) # print '\n'.join(repr(x) for x in [pattern, replacement, subject, limit, count_ref]) # print local if not USING_PCRE: warn(executer) if isinstance(pattern, phparray.PHPArray): pattern = pattern.values() else: pattern = [str(pattern)] if isinstance(replacement, phparray.PHPArray): replacement = replacement.values() else: replacement = [replacement] * len(pattern) rep_len = len(replacement) total_subs = 0 for i, pat in enumerate(pattern): if i < rep_len: repl = replacement[i] else: repl = '' regex, flags = parse_regex(pat) subject, subs_made = re.subn(regex, repl, subject, limit, flags) total_subs += subs_made if len(args) >= 4: executer.set_val(args[4], subs_made) return subject raise StandardError()
def preg_replace(args, executer, local): global USING_PCRE # mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) pattern, replacement, subject = [executer.get_val(x) for x in args[:3]] limit = 0 if len(args) < 4 else executer.get_val(args[3]) count_ref = None if len(args) < 5 else args[4] # print dict(zip('pattern,replacement,subject'.split(','), [pattern, replacement, subject])) # print '\n'.join(repr(x) for x in [pattern, replacement, subject, limit, count_ref]) # print local if not USING_PCRE: warn(executer) if isinstance(pattern, phparray.PHPArray): pattern = pattern.values() else: pattern = [str(pattern)] if isinstance(replacement, phparray.PHPArray): replacement = replacement.values() else: replacement = [replacement] * len(pattern) rep_len = len(replacement) total_subs = 0 for i, pat in enumerate(pattern): if i < rep_len: repl = replacement[i] else: repl='' regex, flags = parse_regex(pat) subject, subs_made = re.subn(regex, repl, subject, limit, flags) total_subs+=subs_made if len(args) >= 4: executer.set_val(args[4], subs_made) return subject raise StandardError()
def test_large_subn(self, size): # Issue #10182: indices were 32-bit-truncated. s = 'a' * size r, n = re.subn('', '', s) self.assertEqual(r, s) self.assertEqual(n, size + 1)
def test_re_subn(self): self.assertEqual(re.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2)) self.assertEqual(re.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1)) self.assertEqual(re.subn("b+", "x", "xyz"), ('xyz', 0)) self.assertEqual(re.subn("b*", "x", "xyz"), ('xxxyxzx', 4)) self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2))