]> granicus.if.org Git - python/commitdiff
Locale data that contains regex metacharacters are now properly escaped.
authorBrett Cannon <bcannon@gmail.com>
Wed, 6 Oct 2004 02:11:37 +0000 (02:11 +0000)
committerBrett Cannon <bcannon@gmail.com>
Wed, 6 Oct 2004 02:11:37 +0000 (02:11 +0000)
Closes bug #1039270.

Lib/_strptime.py
Lib/test/test_strptime.py
Misc/NEWS

index 22455ae9934c3ddd94143123da5494dd2baaf2d7..d93139ebeb66674a0766ea85878453299ef36f65 100644 (file)
@@ -15,6 +15,7 @@ import locale
 import calendar
 from re import compile as re_compile
 from re import IGNORECASE
+from re import escape as re_escape
 from datetime import date as datetime_date
 try:
     from thread import allocate_lock as _thread_allocate_lock
@@ -232,7 +233,7 @@ class TimeRE(dict):
             return ''
         to_convert = to_convert[:]
         to_convert.sort(key=len, reverse=True)
-        regex = '|'.join(to_convert)
+        regex = '|'.join(re_escape(stuff) for stuff in to_convert)
         regex = '(?P<%s>%s' % (directive, regex)
         return '%s)' % regex
 
@@ -245,7 +246,8 @@ class TimeRE(dict):
         """
         processed_format = ''
         # The sub() call escapes all characters that might be misconstrued
-        # as regex syntax.
+        # as regex syntax.  Cannot use re.escape since we have to deal with
+        # format directives (%m, etc.).
         regex_chars = re_compile(r"([\\.^$*+?\(\){}\[\]|])")
         format = regex_chars.sub(r"\\\1", format)
         whitespace_replacement = re_compile('\s+')
index 5aaa9a70e43a681f16339b27c3b30dc5d9da4f6e..17f339b349eadf78e8ce8e83cbe7e97a29d0339d 100644 (file)
@@ -176,6 +176,19 @@ class TimeRETests(unittest.TestCase):
         found = compiled_re.match("\w+ 10")
         self.failUnless(found, "Escaping failed of format '\w+ 10'")
 
+    def test_locale_data_w_regex_metacharacters(self):
+        # Check that if locale data contains regex metacharacters they are
+        # escaped properly.
+        # Discovered by bug #1039270 .
+        locale_time = _strptime.LocaleTime()
+        locale_time.timezone = (frozenset(("utc", "gmt",
+                                            "Tokyo (standard time)")),
+                                frozenset("Tokyo (daylight time)"))
+        time_re = _strptime.TimeRE(locale_time)
+        self.failUnless(time_re.compile("%Z").match("Tokyo (standard time)"),
+                        "locale data that contains regex metacharacters is not"
+                        " properly escaped")
+
 class StrptimeTests(unittest.TestCase):
     """Tests for _strptime.strptime."""
 
index 7927036982e4fc8d29fe42f1c5d7259410c99657..81db100b53b12df79060b1e05ea9fc3af905be20 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,11 @@ Extension modules
 Library
 -------
 
+- time.strptime() now properly escapes timezones and all other locale-specific
+  strings for regex-specific symbols.  Was breaking under Japanese Windows when
+  the timezone was specified as "Tokyo (standard time)".
+  Closes bug #1039270.
+
 - Updates for the email package:
   + All deprecated APIs that in email 2.x issued warnings have been removed:
     _encoder argument to the MIMEText constructor, Message.add_payload(),