diff options
author | Ezio Melotti <ezio.melotti@gmail.com> | 2012-02-29 09:49:45 (GMT) |
---|---|---|
committer | Ezio Melotti <ezio.melotti@gmail.com> | 2012-02-29 09:49:45 (GMT) |
commit | 0b8123d8ae14520aa5c8623e1c829e9e44bfe04b (patch) | |
tree | 0a5fce405cb7bc5155ec30c53bfd7f0a55057008 | |
parent | 7b5649cd48fbccceb182ff5cde8eecc20a93954a (diff) | |
parent | 5a045b9f5493b12bc8421b55ffff10b6572bc22c (diff) | |
download | cpython-0b8123d8ae14520aa5c8623e1c829e9e44bfe04b.zip cpython-0b8123d8ae14520aa5c8623e1c829e9e44bfe04b.tar.gz cpython-0b8123d8ae14520aa5c8623e1c829e9e44bfe04b.tar.bz2 |
#10713: merge with 3.2.
-rw-r--r-- | Doc/library/re.rst | 22 | ||||
-rw-r--r-- | Lib/test/test_re.py | 26 |
2 files changed, 40 insertions, 8 deletions
diff --git a/Doc/library/re.rst b/Doc/library/re.rst index d3d97c0..8df8aaa 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -330,16 +330,22 @@ the second character. For example, ``\$`` matches the character ``'$'``. Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of Unicode alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a - non-alphanumeric, non-underscore Unicode character. Note that - formally, ``\b`` is defined as the boundary between a ``\w`` and a - ``\W`` character (or vice versa). By default Unicode alphanumerics - are the ones used, but this can be changed by using the :const:`ASCII` - flag. Inside a character range, ``\b`` represents the backspace - character, for compatibility with Python's string literals. + non-alphanumeric, non-underscore Unicode character. Note that formally, + ``\b`` is defined as the boundary between a ``\w`` and a ``\W`` character + (or vice versa), or between ``\w`` and the beginning/end of the string. + This means that ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, + ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. + + By default Unicode alphanumerics are the ones used, but this can be changed + by using the :const:`ASCII` flag. Inside a character range, ``\b`` + represents the backspace character, for compatibility with Python's string + literals. ``\B`` - Matches the empty string, but only when it is *not* at the beginning or end of a - word. This is just the opposite of ``\b``, so word characters are + Matches the empty string, but only when it is *not* at the beginning or end + of a word. This means that ``r'py\B'`` matches ``'python'``, ``'py3'``, + ``'py2'``, but not ``'py'``, ``'py.'``, or ``'py!'``. + ``\B`` is just the opposite of ``\b``, so word characters are Unicode alphanumerics or the underscore, although this can be changed by using the :const:`ASCII` flag. diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index d23c49b..0d5f617 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -355,6 +355,32 @@ class ReTests(unittest.TestCase): self.assertEqual(re.search(r"\d\D\w\W\s\S", "1aa! a", re.UNICODE).group(0), "1aa! a") + def test_string_boundaries(self): + # See http://bugs.python.org/issue10713 + self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), + "abc") + # There's a word boundary at the start of a string. + self.assertTrue(re.match(r"\b", "abc")) + # A non-empty string includes a non-boundary zero-length match. + self.assertTrue(re.search(r"\B", "abc")) + # There is no non-boundary match at the start of a string. + self.assertFalse(re.match(r"\B", "abc")) + # However, an empty string contains no word boundaries, and also no + # non-boundaries. + self.assertEqual(re.search(r"\B", ""), None) + # This one is questionable and different from the perlre behaviour, + # but describes current behavior. + self.assertEqual(re.search(r"\b", ""), None) + # A single word-character string has two boundaries, but no + # non-boundary gaps. + self.assertEqual(len(re.findall(r"\b", "a")), 2) + self.assertEqual(len(re.findall(r"\B", "a")), 0) + # If there are no words, there are no boundaries + self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ")), 0) + # Can match around the whitespace. + self.assertEqual(len(re.findall(r"\B", " ")), 2) + def test_bigcharset(self): self.assertEqual(re.match("([\u2222\u2223])", "\u2222").group(1), "\u2222") |