]> granicus.if.org Git - python/commitdiff
Issue 1519638: Now unmatched groups are replaced with empty strings in re.sub()
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 10 Oct 2014 08:06:31 +0000 (11:06 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 10 Oct 2014 08:06:31 +0000 (11:06 +0300)
and re.subn().

Doc/library/re.rst
Doc/whatsnew/3.5.rst
Lib/sre_parse.py
Lib/test/test_re.py
Misc/NEWS

index edb24864f293d773f1c4942783cb7503d38ff7dd..48e3006ef989b66f392fdd89662147b36eef6461 100644 (file)
@@ -701,6 +701,9 @@ form.
    .. versionchanged:: 3.1
       Added the optional flags argument.
 
+   .. versionchanged:: 3.5
+      Unmatched groups are replaced with an empty string.
+
 
 .. function:: subn(pattern, repl, string, count=0, flags=0)
 
@@ -710,6 +713,9 @@ form.
    .. versionchanged:: 3.1
       Added the optional flags argument.
 
+   .. versionchanged:: 3.5
+      Unmatched groups are replaced with an empty string.
+
 
 .. function:: escape(string)
 
@@ -885,6 +891,8 @@ Match objects support the following methods and attributes:
    (``\g<1>``, ``\g<name>``) are replaced by the contents of the
    corresponding group.
 
+   .. versionchanged:: 3.5
+      Unmatched groups are replaced with an empty string.
 
 .. method:: match.group([group1, ...])
 
index feca241cf0ac28d78afd65f5f739e556916ec541..319284a8cc18f6698f212ea48d4fdc9139e9ff6f 100644 (file)
@@ -223,6 +223,9 @@ re
 * Number of capturing groups in regular expression is no longer limited by 100.
   (Contributed by Serhiy Storchaka in :issue:`22437`.)
 
+* Now unmatched groups are replaced with empty strings in :func:`re.sub`
+  and :func:`re.subn`.  (Contributed by Serhiy Storchaka in :issue:`1519638`.)
+
 shutil
 ------
 
index b9a1852823dac597bede84ff07b729f958ffb67a..063d1b7fda6e12cfda995cdb1b946fd11a3eb767 100644 (file)
@@ -880,14 +880,12 @@ def parse_template(source, pattern):
 
 def expand_template(template, match):
     g = match.group
-    sep = match.string[:0]
+    empty = match.string[:0]
     groups, literals = template
     literals = literals[:]
     try:
         for index, group in groups:
-            literals[index] = s = g(group)
-            if s is None:
-                raise error("unmatched group")
+            literals[index] = g(group) or empty
     except IndexError:
         raise error("invalid group reference")
-    return sep.join(literals)
+    return empty.join(literals)
index e5ad6cb6bc1ee80110f0beb6c5557ca2eaad3736..0e4fa88f5d98f0c238df8e34c501152604bb972e 100644 (file)
@@ -225,9 +225,11 @@ class ReTests(unittest.TestCase):
         self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a a>', 'xx')
         self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<>', 'xx')
         self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<1a1>', 'xx')
+        self.assertRaises(re.error, re.sub, '(?P<a>x)', r'\g<2>', 'xx')
+        self.assertRaises(re.error, re.sub, '(?P<a>x)', r'\2', 'xx')
         self.assertRaises(IndexError, re.sub, '(?P<a>x)', '\g<ab>', 'xx')
-        self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')
-        self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\\2', 'xx')
+        self.assertEqual(re.sub('(?P<a>x)|(?P<b>y)', r'\g<b>', 'xx'), '')
+        self.assertEqual(re.sub('(?P<a>x)|(?P<b>y)', r'\2', 'xx'), '')
         self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<-1>', 'xx')
         # New valid/invalid identifiers in Python 3
         self.assertEqual(re.sub('(?P<µ>x)', r'\g<µ>', 'xx'), 'xx')
@@ -439,6 +441,10 @@ class ReTests(unittest.TestCase):
                                   "first second")
                                   .expand(r"\2 \1 \g<second> \g<first>"),
                          "second first second first")
+        self.assertEqual(re.match("(?P<first>first)|(?P<second>second)",
+                                  "first")
+                                  .expand(r"\2 \g<second>"),
+                         " ")
 
     def test_repeat_minmax(self):
         self.assertIsNone(re.match("^(\w){1}$", "abc"))
index 21ee7b2cbf1c520a7ae0e5d35bad81fb177d3f5b..c3932d7eac516b64cf497085d892777c08e86903 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -166,7 +166,10 @@ Core and Builtins
 Library
 -------
 
-- Issue $18615: sndhdr.what/whathdr now return a namedtuple.
+- Issue 1519638: Now unmatched groups are replaced with empty strings in re.sub()
+  and re.subn().
+
+- Issue #18615: sndhdr.what/whathdr now return a namedtuple.
 
 - Issue #22462: Fix pyexpat's creation of a dummy frame to make it
   appear in exception tracebacks.