mirror of
https://github.com/python/cpython.git
synced 2025-07-16 07:45:20 +00:00

svn+ssh://pythondev@svn.python.org/python/trunk ........ r58096 | brett.cannon | 2007-09-10 23:38:27 +0200 (Mon, 10 Sep 2007) | 4 lines Fix a possible segfault from recursing too deep to get the repr of a list. Closes issue #1096. ........ r58097 | bill.janssen | 2007-09-10 23:51:02 +0200 (Mon, 10 Sep 2007) | 33 lines More work on SSL support. * Much expanded test suite: All protocols tested against all other protocols. All protocols tested with all certificate options. Tests for bad key and bad cert. Test of STARTTLS functionality. Test of RAND_* functions. * Fixes for threading/malloc bug. * Issue 1065 fixed: sslsocket class renamed to SSLSocket. sslerror class renamed to SSLError. Function "wrap_socket" now used to wrap an existing socket. * Issue 1583946 finally fixed: Support for subjectAltName added. Subject name now returned as proper DN list of RDNs. * SSLError exported from socket as "sslerror". * RAND_* functions properly exported from ssl.py. * Documentation improved: Example of how to create a self-signed certificate. Better indexing. ........ r58098 | guido.van.rossum | 2007-09-11 00:02:25 +0200 (Tue, 11 Sep 2007) | 9 lines Patch # 1140 (my code, approved by Effbot). Make sure the type of the return value of re.sub(x, y, z) is the type of y+x (i.e. unicode if either is unicode, str if they are both str) even if there are no substitutions or if x==z (which triggered various special cases in join_list()). Could be backported to 2.5; no need to port to 3.0. ........ r58099 | guido.van.rossum | 2007-09-11 00:36:02 +0200 (Tue, 11 Sep 2007) | 8 lines Patch # 1026 by Benjamin Aranguren (with Alex Martelli): Backport abc.py and isinstance/issubclass overloading to 2.6. I had to backport test_typechecks.py myself, and make one small change to abc.py to avoid duplicate work when x.__class__ and type(x) are the same. ........ r58100 | bill.janssen | 2007-09-11 01:41:24 +0200 (Tue, 11 Sep 2007) | 3 lines A better way of finding an open port to test with. ........ r58101 | bill.janssen | 2007-09-11 03:09:19 +0200 (Tue, 11 Sep 2007) | 4 lines Make sure test_ssl doesn't reference the ssl module in a context where it can't be imported. ........ r58102 | bill.janssen | 2007-09-11 04:42:07 +0200 (Tue, 11 Sep 2007) | 3 lines Fix some documentation bugs. ........ r58103 | nick.coghlan | 2007-09-11 16:01:18 +0200 (Tue, 11 Sep 2007) | 1 line Always use the -E flag when spawning subprocesses in test_cmd_line (Issue 1056) ........ r58106 | thomas.heller | 2007-09-11 21:17:48 +0200 (Tue, 11 Sep 2007) | 3 lines Disable some tests that fail on the 'ppc Debian unstable' buildbot to find out if they cause the segfault on the 'alpha Debian' machine. ........ r58108 | brett.cannon | 2007-09-11 23:02:28 +0200 (Tue, 11 Sep 2007) | 6 lines Generators had their throw() method allowing string exceptions. That's a no-no. Fixes issue #1147. Need to fix 2.5 to raise a proper warning if a string exception is passed in. ........ r58112 | georg.brandl | 2007-09-12 20:03:51 +0200 (Wed, 12 Sep 2007) | 3 lines New documentation page for the bdb module. (This doesn't need to be merged to Py3k.) ........ r58114 | georg.brandl | 2007-09-12 20:05:57 +0200 (Wed, 12 Sep 2007) | 2 lines Bug #1152: use non-deprecated name in example. ........ r58115 | georg.brandl | 2007-09-12 20:08:33 +0200 (Wed, 12 Sep 2007) | 2 lines Fix #1122: wrong return type documented for various _Size() functions. ........ r58117 | georg.brandl | 2007-09-12 20:10:56 +0200 (Wed, 12 Sep 2007) | 2 lines Fix #1139: PyFile_Encoding really is PyFile_SetEncoding. ........ r58119 | georg.brandl | 2007-09-12 20:29:18 +0200 (Wed, 12 Sep 2007) | 2 lines bug #1154: release memory allocated by "es" PyArg_ParseTuple format specifier. ........ r58121 | bill.janssen | 2007-09-12 20:52:05 +0200 (Wed, 12 Sep 2007) | 1 line root certificate for https://svn.python.org/, used in test_ssl ........ r58122 | georg.brandl | 2007-09-12 21:00:07 +0200 (Wed, 12 Sep 2007) | 3 lines Bug #1153: repr.repr() now doesn't require set and dictionary items to be orderable to properly represent them. ........ r58125 | georg.brandl | 2007-09-12 21:29:28 +0200 (Wed, 12 Sep 2007) | 4 lines #1120: put explicit version in the shebang lines of pydoc, idle and smtpd.py scripts that are installed by setup.py. That way, they work when only "make altinstall" is used. ........ r58139 | mark.summerfield | 2007-09-13 16:54:30 +0200 (Thu, 13 Sep 2007) | 9 lines Replaced variable o with obj in operator.rst because o is easy to confuse. Added a note about Python 3's collections.Mapping etc., above section that describes isMappingType() etc. Added xrefs between os, os.path, fileinput, and open(). ........ r58143 | facundo.batista | 2007-09-13 20:13:15 +0200 (Thu, 13 Sep 2007) | 7 lines Merged the decimal-branch (revisions 54886 to 58140). Decimal is now fully updated to the latests Decimal Specification (v1.66) and the latests test cases (v2.56). Thanks to Mark Dickinson for all his help during this process. ........ r58145 | facundo.batista | 2007-09-13 20:42:09 +0200 (Thu, 13 Sep 2007) | 7 lines Put the parameter watchexp back in (changed watchexp from an int to a bool). Also second argument to watchexp is now converted to Decimal, just as with all the other two-argument operations. Thanks Mark Dickinson. ........ r58147 | andrew.kuchling | 2007-09-14 00:49:34 +0200 (Fri, 14 Sep 2007) | 1 line Add various items ........ r58148 | andrew.kuchling | 2007-09-14 00:50:10 +0200 (Fri, 14 Sep 2007) | 1 line Make target unique ........ r58154 | facundo.batista | 2007-09-14 20:58:34 +0200 (Fri, 14 Sep 2007) | 3 lines Included the new functions, and new descriptions. ........ r58155 | thomas.heller | 2007-09-14 21:40:35 +0200 (Fri, 14 Sep 2007) | 2 lines ctypes.util.find_library uses dump(1) instead of objdump(1) on Solaris. Fixes issue #1777530; will backport to release25-maint. ........ r58159 | facundo.batista | 2007-09-14 23:29:52 +0200 (Fri, 14 Sep 2007) | 3 lines Some additions (examples and a bit on the tutorial). ........ r58160 | georg.brandl | 2007-09-15 18:53:36 +0200 (Sat, 15 Sep 2007) | 2 lines Remove bdb from the "undocumented modules" list. ........ r58164 | bill.janssen | 2007-09-17 00:06:00 +0200 (Mon, 17 Sep 2007) | 15 lines Add support for asyncore server-side SSL support. This requires adding the 'makefile' method to ssl.SSLSocket, and importing the requisite fakefile class from socket.py, and making the appropriate changes to it to make it use the SSL connection. Added sample HTTPS server to test_ssl.py, and test that uses it. Change SSL tests to use https://svn.python.org/, instead of www.sf.net and pop.gmail.com. Added utility function to ssl module, get_server_certificate, to wrap up the several things to be done to pull a certificate from a remote server. ........ r58173 | bill.janssen | 2007-09-17 01:16:46 +0200 (Mon, 17 Sep 2007) | 1 line use binary mode when reading files for testAsyncore to make Windows happy ........ r58175 | raymond.hettinger | 2007-09-17 02:55:00 +0200 (Mon, 17 Sep 2007) | 7 lines Sync-up named tuples with the latest version of the ASPN recipe. Allows optional commas in the field-name spec (help when named tuples are used in conjuction with sql queries). Adds the __fields__ attribute for introspection and to support conversion to dictionary form. Adds a __replace__() method similar to str.replace() but using a named field as a target. Clean-up spelling and presentation in doc-strings. ........ r58176 | brett.cannon | 2007-09-17 05:28:34 +0200 (Mon, 17 Sep 2007) | 5 lines Add a bunch of GIL release/acquire points in tp_print implementations and for PyObject_Print(). Closes issue #1164. ........ r58177 | sean.reifschneider | 2007-09-17 07:45:04 +0200 (Mon, 17 Sep 2007) | 2 lines issue1597011: Fix for bz2 module corner-case error due to error checking bug. ........ r58180 | facundo.batista | 2007-09-17 18:26:50 +0200 (Mon, 17 Sep 2007) | 3 lines Decimal is updated, :) ........ r58181 | facundo.batista | 2007-09-17 19:30:13 +0200 (Mon, 17 Sep 2007) | 5 lines The methods always return Decimal classes, even if they're executed through a subclass (thanks Mark Dickinson). Added a bit of testing for this. ........ r58183 | sean.reifschneider | 2007-09-17 22:53:21 +0200 (Mon, 17 Sep 2007) | 2 lines issue1082: Fixing platform and system for Vista. ........ r58185 | andrew.kuchling | 2007-09-18 03:36:16 +0200 (Tue, 18 Sep 2007) | 1 line Add item; sort properly ........ r58186 | raymond.hettinger | 2007-09-18 05:33:19 +0200 (Tue, 18 Sep 2007) | 1 line Handle corner cased on 0-tuples and 1-tuples. Add verbose option so people can see how it works. ........ r58192 | georg.brandl | 2007-09-18 09:24:40 +0200 (Tue, 18 Sep 2007) | 2 lines A bit of reordering, also show more subheadings in the lang ref index. ........ r58193 | facundo.batista | 2007-09-18 18:53:18 +0200 (Tue, 18 Sep 2007) | 4 lines Speed up of the various division operations (remainder, divide, divideint and divmod). Thanks Mark Dickinson. ........ r58197 | raymond.hettinger | 2007-09-19 00:18:02 +0200 (Wed, 19 Sep 2007) | 1 line Cleanup docs for NamedTuple. ........
755 lines
34 KiB
Python
755 lines
34 KiB
Python
import sys
|
|
sys.path = ['.'] + sys.path
|
|
|
|
from test.test_support import verbose, run_unittest, catch_warning
|
|
import re
|
|
from re import Scanner
|
|
import sys, os, traceback
|
|
from weakref import proxy
|
|
|
|
# Misc tests from Tim Peters' re.doc
|
|
|
|
# WARNING: Don't change details in these tests if you don't know
|
|
# what you're doing. Some of these tests were carefuly modeled to
|
|
# cover most of the code.
|
|
|
|
import unittest
|
|
|
|
class ReTests(unittest.TestCase):
|
|
|
|
def test_weakref(self):
|
|
s = 'QabbbcR'
|
|
x = re.compile('ab+c')
|
|
y = proxy(x)
|
|
self.assertEqual(x.findall('QabbbcR'), y.findall('QabbbcR'))
|
|
|
|
def test_search_star_plus(self):
|
|
self.assertEqual(re.search('x*', 'axx').span(0), (0, 0))
|
|
self.assertEqual(re.search('x*', 'axx').span(), (0, 0))
|
|
self.assertEqual(re.search('x+', 'axx').span(0), (1, 3))
|
|
self.assertEqual(re.search('x+', 'axx').span(), (1, 3))
|
|
self.assertEqual(re.search('x', 'aaa'), None)
|
|
self.assertEqual(re.match('a*', 'xxx').span(0), (0, 0))
|
|
self.assertEqual(re.match('a*', 'xxx').span(), (0, 0))
|
|
self.assertEqual(re.match('x*', 'xxxa').span(0), (0, 3))
|
|
self.assertEqual(re.match('x*', 'xxxa').span(), (0, 3))
|
|
self.assertEqual(re.match('a+', 'xxx'), None)
|
|
|
|
def bump_num(self, matchobj):
|
|
int_value = int(matchobj.group(0))
|
|
return str(int_value + 1)
|
|
|
|
def test_basic_re_sub(self):
|
|
self.assertEqual(re.sub("(?i)b+", "x", "bbbb BBBB"), 'x x')
|
|
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'),
|
|
'9.3 -3 24x100y')
|
|
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3),
|
|
'9.3 -3 23x99y')
|
|
|
|
self.assertEqual(re.sub('.', lambda m: r"\n", 'x'), '\\n')
|
|
self.assertEqual(re.sub('.', r"\n", 'x'), '\n')
|
|
|
|
s = r"\1\1"
|
|
self.assertEqual(re.sub('(.)', s, 'x'), 'xx')
|
|
self.assertEqual(re.sub('(.)', re.escape(s), 'x'), s)
|
|
self.assertEqual(re.sub('(.)', lambda m: s, 'x'), s)
|
|
|
|
self.assertEqual(re.sub('(?P<a>x)', '\g<a>\g<a>', 'xx'), 'xxxx')
|
|
self.assertEqual(re.sub('(?P<a>x)', '\g<a>\g<1>', 'xx'), 'xxxx')
|
|
self.assertEqual(re.sub('(?P<unk>x)', '\g<unk>\g<unk>', 'xx'), 'xxxx')
|
|
self.assertEqual(re.sub('(?P<unk>x)', '\g<1>\g<1>', 'xx'), 'xxxx')
|
|
|
|
self.assertEqual(re.sub('a',r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D','a'),
|
|
'\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D')
|
|
self.assertEqual(re.sub('a', '\t\n\v\r\f\a', 'a'), '\t\n\v\r\f\a')
|
|
self.assertEqual(re.sub('a', '\t\n\v\r\f\a', 'a'),
|
|
(chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)))
|
|
|
|
self.assertEqual(re.sub('^\s*', 'X', 'test'), 'Xtest')
|
|
|
|
def test_bug_449964(self):
|
|
# fails for group followed by other escape
|
|
self.assertEqual(re.sub(r'(?P<unk>x)', '\g<1>\g<1>\\b', 'xx'),
|
|
'xx\bxx\b')
|
|
|
|
def test_bug_449000(self):
|
|
# Test for sub() on escaped characters
|
|
self.assertEqual(re.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n'),
|
|
'abc\ndef\n')
|
|
self.assertEqual(re.sub('\r\n', r'\n', 'abc\r\ndef\r\n'),
|
|
'abc\ndef\n')
|
|
self.assertEqual(re.sub(r'\r\n', '\n', 'abc\r\ndef\r\n'),
|
|
'abc\ndef\n')
|
|
self.assertEqual(re.sub('\r\n', '\n', 'abc\r\ndef\r\n'),
|
|
'abc\ndef\n')
|
|
|
|
# This test makes no sense until re supports bytes, and should then probably
|
|
# test for the *in*ability to mix bytes and str this way :)
|
|
#
|
|
# def test_bug_1140(self):
|
|
# # re.sub(x, y, b'') should return b'', not '', and
|
|
# # re.sub(x, y, '') should return '', not b''.
|
|
# # Also:
|
|
# # re.sub(x, y, str(x)) should return str(y), and
|
|
# # re.sub(x, y, bytes(x)) should return
|
|
# # str(y) if isinstance(y, str) else unicode(y).
|
|
# for x in 'x', u'x':
|
|
# for y in 'y', u'y':
|
|
# z = re.sub(x, y, u'')
|
|
# self.assertEqual(z, u'')
|
|
# self.assertEqual(type(z), unicode)
|
|
# #
|
|
# z = re.sub(x, y, '')
|
|
# self.assertEqual(z, '')
|
|
# self.assertEqual(type(z), str)
|
|
# #
|
|
# z = re.sub(x, y, unicode(x))
|
|
# self.assertEqual(z, y)
|
|
# self.assertEqual(type(z), unicode)
|
|
# #
|
|
# z = re.sub(x, y, str(x))
|
|
# self.assertEqual(z, y)
|
|
# self.assertEqual(type(z), type(y))
|
|
|
|
def test_sub_template_numeric_escape(self):
|
|
# bug 776311 and friends
|
|
self.assertEqual(re.sub('x', r'\0', 'x'), '\0')
|
|
self.assertEqual(re.sub('x', r'\000', 'x'), '\000')
|
|
self.assertEqual(re.sub('x', r'\001', 'x'), '\001')
|
|
self.assertEqual(re.sub('x', r'\008', 'x'), '\0' + '8')
|
|
self.assertEqual(re.sub('x', r'\009', 'x'), '\0' + '9')
|
|
self.assertEqual(re.sub('x', r'\111', 'x'), '\111')
|
|
self.assertEqual(re.sub('x', r'\117', 'x'), '\117')
|
|
|
|
self.assertEqual(re.sub('x', r'\1111', 'x'), '\1111')
|
|
self.assertEqual(re.sub('x', r'\1111', 'x'), '\111' + '1')
|
|
|
|
self.assertEqual(re.sub('x', r'\00', 'x'), '\x00')
|
|
self.assertEqual(re.sub('x', r'\07', 'x'), '\x07')
|
|
self.assertEqual(re.sub('x', r'\08', 'x'), '\0' + '8')
|
|
self.assertEqual(re.sub('x', r'\09', 'x'), '\0' + '9')
|
|
self.assertEqual(re.sub('x', r'\0a', 'x'), '\0' + 'a')
|
|
|
|
self.assertEqual(re.sub('x', r'\400', 'x'), '\0')
|
|
self.assertEqual(re.sub('x', r'\777', 'x'), '\377')
|
|
|
|
self.assertRaises(re.error, re.sub, 'x', r'\1', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\8', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\9', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\11', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\18', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\1a', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\90', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\99', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\118', 'x') # r'\11' + '8'
|
|
self.assertRaises(re.error, re.sub, 'x', r'\11a', 'x')
|
|
self.assertRaises(re.error, re.sub, 'x', r'\181', 'x') # r'\18' + '1'
|
|
self.assertRaises(re.error, re.sub, 'x', r'\800', 'x') # r'\80' + '0'
|
|
|
|
# in python2.3 (etc), these loop endlessly in sre_parser.py
|
|
self.assertEqual(re.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x')
|
|
self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\118', 'xyz'),
|
|
'xz8')
|
|
self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\11a', 'xyz'),
|
|
'xza')
|
|
|
|
def test_qualified_re_sub(self):
|
|
self.assertEqual(re.sub('a', 'b', 'aaaaa'), 'bbbbb')
|
|
self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa')
|
|
|
|
def test_bug_114660(self):
|
|
self.assertEqual(re.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'),
|
|
'hello there')
|
|
|
|
def test_bug_462270(self):
|
|
# Test for empty sub() behaviour, see SF bug #462270
|
|
self.assertEqual(re.sub('x*', '-', 'abxd'), '-a-b-d-')
|
|
self.assertEqual(re.sub('x+', '-', 'abxd'), 'ab-d')
|
|
|
|
def test_symbolic_refs(self):
|
|
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a', 'xx')
|
|
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<', 'xx')
|
|
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g', 'xx')
|
|
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a a>', 'xx')
|
|
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<1a1>', '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.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<-1>', 'xx')
|
|
|
|
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))
|
|
|
|
def test_re_split(self):
|
|
self.assertEqual(re.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c'])
|
|
self.assertEqual(re.split(":*", ":a:b::c"), ['', 'a', 'b', 'c'])
|
|
self.assertEqual(re.split("(:*)", ":a:b::c"),
|
|
['', ':', 'a', ':', 'b', '::', 'c'])
|
|
self.assertEqual(re.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c'])
|
|
self.assertEqual(re.split("(:)*", ":a:b::c"),
|
|
['', ':', 'a', ':', 'b', ':', 'c'])
|
|
self.assertEqual(re.split("([b:]+)", ":a:b::c"),
|
|
['', ':', 'a', ':b::', 'c'])
|
|
self.assertEqual(re.split("(b)|(:+)", ":a:b::c"),
|
|
['', None, ':', 'a', None, ':', '', 'b', None, '',
|
|
None, '::', 'c'])
|
|
self.assertEqual(re.split("(?:b)|(?::+)", ":a:b::c"),
|
|
['', 'a', '', '', 'c'])
|
|
|
|
def test_qualified_re_split(self):
|
|
self.assertEqual(re.split(":", ":a:b::c", 2), ['', 'a', 'b::c'])
|
|
self.assertEqual(re.split(':', 'a:b:c:d', 2), ['a', 'b', 'c:d'])
|
|
self.assertEqual(re.split("(:)", ":a:b::c", 2),
|
|
['', ':', 'a', ':', 'b::c'])
|
|
self.assertEqual(re.split("(:*)", ":a:b::c", 2),
|
|
['', ':', 'a', ':', 'b::c'])
|
|
|
|
def test_re_findall(self):
|
|
self.assertEqual(re.findall(":+", "abc"), [])
|
|
self.assertEqual(re.findall(":+", "a:b::c:::d"), [":", "::", ":::"])
|
|
self.assertEqual(re.findall("(:+)", "a:b::c:::d"), [":", "::", ":::"])
|
|
self.assertEqual(re.findall("(:)(:*)", "a:b::c:::d"), [(":", ""),
|
|
(":", ":"),
|
|
(":", "::")])
|
|
|
|
def test_bug_117612(self):
|
|
self.assertEqual(re.findall(r"(a|(b))", "aba"),
|
|
[("a", ""),("b", "b"),("a", "")])
|
|
|
|
def test_re_match(self):
|
|
self.assertEqual(re.match('a', 'a').groups(), ())
|
|
self.assertEqual(re.match('(a)', 'a').groups(), ('a',))
|
|
self.assertEqual(re.match(r'(a)', 'a').group(0), 'a')
|
|
self.assertEqual(re.match(r'(a)', 'a').group(1), 'a')
|
|
self.assertEqual(re.match(r'(a)', 'a').group(1, 1), ('a', 'a'))
|
|
|
|
pat = re.compile('((a)|(b))(c)?')
|
|
self.assertEqual(pat.match('a').groups(), ('a', 'a', None, None))
|
|
self.assertEqual(pat.match('b').groups(), ('b', None, 'b', None))
|
|
self.assertEqual(pat.match('ac').groups(), ('a', 'a', None, 'c'))
|
|
self.assertEqual(pat.match('bc').groups(), ('b', None, 'b', 'c'))
|
|
self.assertEqual(pat.match('bc').groups(""), ('b', "", 'b', 'c'))
|
|
|
|
# A single group
|
|
m = re.match('(a)', 'a')
|
|
self.assertEqual(m.group(0), 'a')
|
|
self.assertEqual(m.group(0), 'a')
|
|
self.assertEqual(m.group(1), 'a')
|
|
self.assertEqual(m.group(1, 1), ('a', 'a'))
|
|
|
|
pat = re.compile('(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?')
|
|
self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None))
|
|
self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'),
|
|
(None, 'b', None))
|
|
self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c'))
|
|
|
|
def test_re_groupref_exists(self):
|
|
self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a)').groups(),
|
|
('(', 'a'))
|
|
self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a').groups(),
|
|
(None, 'a'))
|
|
self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a)'), None)
|
|
self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a'), None)
|
|
self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'ab').groups(),
|
|
('a', 'b'))
|
|
self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'cd').groups(),
|
|
(None, 'd'))
|
|
self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'cd').groups(),
|
|
(None, 'd'))
|
|
self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'a').groups(),
|
|
('a', ''))
|
|
|
|
# Tests for bug #1177831: exercise groups other than the first group
|
|
p = re.compile('(?P<g1>a)(?P<g2>b)?((?(g2)c|d))')
|
|
self.assertEqual(p.match('abc').groups(),
|
|
('a', 'b', 'c'))
|
|
self.assertEqual(p.match('ad').groups(),
|
|
('a', None, 'd'))
|
|
self.assertEqual(p.match('abd'), None)
|
|
self.assertEqual(p.match('ac'), None)
|
|
|
|
|
|
def test_re_groupref(self):
|
|
self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a|').groups(),
|
|
('|', 'a'))
|
|
self.assertEqual(re.match(r'^(\|)?([^()]+)\1?$', 'a').groups(),
|
|
(None, 'a'))
|
|
self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', 'a|'), None)
|
|
self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a'), None)
|
|
self.assertEqual(re.match(r'^(?:(a)|c)(\1)$', 'aa').groups(),
|
|
('a', 'a'))
|
|
self.assertEqual(re.match(r'^(?:(a)|c)(\1)?$', 'c').groups(),
|
|
(None, None))
|
|
|
|
def test_groupdict(self):
|
|
self.assertEqual(re.match('(?P<first>first) (?P<second>second)',
|
|
'first second').groupdict(),
|
|
{'first':'first', 'second':'second'})
|
|
|
|
def test_expand(self):
|
|
self.assertEqual(re.match("(?P<first>first) (?P<second>second)",
|
|
"first second")
|
|
.expand(r"\2 \1 \g<second> \g<first>"),
|
|
"second first second first")
|
|
|
|
def test_repeat_minmax(self):
|
|
self.assertEqual(re.match("^(\w){1}$", "abc"), None)
|
|
self.assertEqual(re.match("^(\w){1}?$", "abc"), None)
|
|
self.assertEqual(re.match("^(\w){1,2}$", "abc"), None)
|
|
self.assertEqual(re.match("^(\w){1,2}?$", "abc"), None)
|
|
|
|
self.assertEqual(re.match("^(\w){3}$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){1,3}$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){1,4}$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){3}?$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){1,3}?$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){1,4}?$", "abc").group(1), "c")
|
|
self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
|
|
|
|
self.assertEqual(re.match("^x{1}$", "xxx"), None)
|
|
self.assertEqual(re.match("^x{1}?$", "xxx"), None)
|
|
self.assertEqual(re.match("^x{1,2}$", "xxx"), None)
|
|
self.assertEqual(re.match("^x{1,2}?$", "xxx"), None)
|
|
|
|
self.assertNotEqual(re.match("^x{3}$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{1,3}$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{1,4}$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{3}?$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{1,3}?$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{1,4}?$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
|
|
|
|
self.assertEqual(re.match("^x{}$", "xxx"), None)
|
|
self.assertNotEqual(re.match("^x{}$", "x{}"), None)
|
|
|
|
def test_getattr(self):
|
|
self.assertEqual(re.match("(a)", "a").pos, 0)
|
|
self.assertEqual(re.match("(a)", "a").endpos, 1)
|
|
self.assertEqual(re.match("(a)", "a").string, "a")
|
|
self.assertEqual(re.match("(a)", "a").regs, ((0, 1), (0, 1)))
|
|
self.assertNotEqual(re.match("(a)", "a").re, None)
|
|
|
|
def test_special_escapes(self):
|
|
self.assertEqual(re.search(r"\b(b.)\b",
|
|
"abcd abc bcd bx").group(1), "bx")
|
|
self.assertEqual(re.search(r"\B(b.)\B",
|
|
"abc bcd bc abxd").group(1), "bx")
|
|
self.assertEqual(re.search(r"\b(b.)\b",
|
|
"abcd abc bcd bx", re.LOCALE).group(1), "bx")
|
|
self.assertEqual(re.search(r"\B(b.)\B",
|
|
"abc bcd bc abxd", re.LOCALE).group(1), "bx")
|
|
self.assertEqual(re.search(r"\b(b.)\b",
|
|
"abcd abc bcd bx", re.UNICODE).group(1), "bx")
|
|
self.assertEqual(re.search(r"\B(b.)\B",
|
|
"abc bcd bc abxd", re.UNICODE).group(1), "bx")
|
|
self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
|
|
self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
|
|
self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
|
|
self.assertEqual(re.search(r"\b(b.)\b",
|
|
"abcd abc bcd bx").group(1), "bx")
|
|
self.assertEqual(re.search(r"\B(b.)\B",
|
|
"abc bcd bc abxd").group(1), "bx")
|
|
self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
|
|
self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
|
|
self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
|
|
self.assertEqual(re.search(r"\d\D\w\W\s\S",
|
|
"1aa! a").group(0), "1aa! a")
|
|
self.assertEqual(re.search(r"\d\D\w\W\s\S",
|
|
"1aa! a", re.LOCALE).group(0), "1aa! a")
|
|
self.assertEqual(re.search(r"\d\D\w\W\s\S",
|
|
"1aa! a", re.UNICODE).group(0), "1aa! a")
|
|
|
|
def test_ignore_case(self):
|
|
self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
|
|
self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
|
|
|
|
def test_bigcharset(self):
|
|
self.assertEqual(re.match("([\u2222\u2223])",
|
|
"\u2222").group(1), "\u2222")
|
|
self.assertEqual(re.match("([\u2222\u2223])",
|
|
"\u2222", re.UNICODE).group(1), "\u2222")
|
|
|
|
def test_anyall(self):
|
|
self.assertEqual(re.match("a.b", "a\nb", re.DOTALL).group(0),
|
|
"a\nb")
|
|
self.assertEqual(re.match("a.*b", "a\n\nb", re.DOTALL).group(0),
|
|
"a\n\nb")
|
|
|
|
def test_non_consuming(self):
|
|
self.assertEqual(re.match("(a(?=\s[^a]))", "a b").group(1), "a")
|
|
self.assertEqual(re.match("(a(?=\s[^a]*))", "a b").group(1), "a")
|
|
self.assertEqual(re.match("(a(?=\s[abc]))", "a b").group(1), "a")
|
|
self.assertEqual(re.match("(a(?=\s[abc]*))", "a bc").group(1), "a")
|
|
self.assertEqual(re.match(r"(a)(?=\s\1)", "a a").group(1), "a")
|
|
self.assertEqual(re.match(r"(a)(?=\s\1*)", "a aa").group(1), "a")
|
|
self.assertEqual(re.match(r"(a)(?=\s(abc|a))", "a a").group(1), "a")
|
|
|
|
self.assertEqual(re.match(r"(a(?!\s[^a]))", "a a").group(1), "a")
|
|
self.assertEqual(re.match(r"(a(?!\s[abc]))", "a d").group(1), "a")
|
|
self.assertEqual(re.match(r"(a)(?!\s\1)", "a b").group(1), "a")
|
|
self.assertEqual(re.match(r"(a)(?!\s(abc|a))", "a b").group(1), "a")
|
|
|
|
def test_ignore_case(self):
|
|
self.assertEqual(re.match(r"(a\s[^a])", "a b", re.I).group(1), "a b")
|
|
self.assertEqual(re.match(r"(a\s[^a]*)", "a bb", re.I).group(1), "a bb")
|
|
self.assertEqual(re.match(r"(a\s[abc])", "a b", re.I).group(1), "a b")
|
|
self.assertEqual(re.match(r"(a\s[abc]*)", "a bb", re.I).group(1), "a bb")
|
|
self.assertEqual(re.match(r"((a)\s\2)", "a a", re.I).group(1), "a a")
|
|
self.assertEqual(re.match(r"((a)\s\2*)", "a aa", re.I).group(1), "a aa")
|
|
self.assertEqual(re.match(r"((a)\s(abc|a))", "a a", re.I).group(1), "a a")
|
|
self.assertEqual(re.match(r"((a)\s(abc|a)*)", "a aa", re.I).group(1), "a aa")
|
|
|
|
def test_category(self):
|
|
self.assertEqual(re.match(r"(\s)", " ").group(1), " ")
|
|
|
|
def test_getlower(self):
|
|
import _sre
|
|
self.assertEqual(_sre.getlower(ord('A'), 0), ord('a'))
|
|
self.assertEqual(_sre.getlower(ord('A'), re.LOCALE), ord('a'))
|
|
self.assertEqual(_sre.getlower(ord('A'), re.UNICODE), ord('a'))
|
|
|
|
self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
|
|
self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
|
|
|
|
def test_not_literal(self):
|
|
self.assertEqual(re.search("\s([^a])", " b").group(1), "b")
|
|
self.assertEqual(re.search("\s([^a]*)", " bb").group(1), "bb")
|
|
|
|
def test_search_coverage(self):
|
|
self.assertEqual(re.search("\s(b)", " b").group(1), "b")
|
|
self.assertEqual(re.search("a\s", "a ").group(0), "a ")
|
|
|
|
def test_re_escape(self):
|
|
p=""
|
|
for i in range(0, 256):
|
|
p = p + chr(i)
|
|
self.assertEqual(re.match(re.escape(chr(i)), chr(i)) is not None,
|
|
True)
|
|
self.assertEqual(re.match(re.escape(chr(i)), chr(i)).span(), (0,1))
|
|
|
|
pat=re.compile(re.escape(p))
|
|
self.assertEqual(pat.match(p) is not None, True)
|
|
self.assertEqual(pat.match(p).span(), (0,256))
|
|
|
|
def test_pickling(self):
|
|
import pickle
|
|
self.pickle_test(pickle)
|
|
# old pickles expect the _compile() reconstructor in sre module
|
|
import warnings
|
|
with catch_warning():
|
|
warnings.filterwarnings("ignore", "The sre module is deprecated",
|
|
DeprecationWarning)
|
|
from sre import _compile
|
|
|
|
def pickle_test(self, pickle):
|
|
oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')
|
|
s = pickle.dumps(oldpat)
|
|
newpat = pickle.loads(s)
|
|
self.assertEqual(oldpat, newpat)
|
|
|
|
def test_constants(self):
|
|
self.assertEqual(re.I, re.IGNORECASE)
|
|
self.assertEqual(re.L, re.LOCALE)
|
|
self.assertEqual(re.M, re.MULTILINE)
|
|
self.assertEqual(re.S, re.DOTALL)
|
|
self.assertEqual(re.X, re.VERBOSE)
|
|
|
|
def test_flags(self):
|
|
for flag in [re.I, re.M, re.X, re.S, re.L]:
|
|
self.assertNotEqual(re.compile('^pattern$', flag), None)
|
|
|
|
def test_sre_character_literals(self):
|
|
for i in [0, 8, 16, 32, 64, 127, 128, 255]:
|
|
self.assertNotEqual(re.match(r"\%03o" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"\%03o0" % i, chr(i)+"0"), None)
|
|
self.assertNotEqual(re.match(r"\%03o8" % i, chr(i)+"8"), None)
|
|
self.assertNotEqual(re.match(r"\x%02x" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"\x%02x0" % i, chr(i)+"0"), None)
|
|
self.assertNotEqual(re.match(r"\x%02xz" % i, chr(i)+"z"), None)
|
|
self.assertRaises(re.error, re.match, "\911", "")
|
|
|
|
def test_sre_character_class_literals(self):
|
|
for i in [0, 8, 16, 32, 64, 127, 128, 255]:
|
|
self.assertNotEqual(re.match(r"[\%03o]" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"[\%03o0]" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"[\%03o8]" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"[\x%02x]" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"[\x%02x0]" % i, chr(i)), None)
|
|
self.assertNotEqual(re.match(r"[\x%02xz]" % i, chr(i)), None)
|
|
self.assertRaises(re.error, re.match, "[\911]", "")
|
|
|
|
def test_bug_113254(self):
|
|
self.assertEqual(re.match(r'(a)|(b)', 'b').start(1), -1)
|
|
self.assertEqual(re.match(r'(a)|(b)', 'b').end(1), -1)
|
|
self.assertEqual(re.match(r'(a)|(b)', 'b').span(1), (-1, -1))
|
|
|
|
def test_bug_527371(self):
|
|
# bug described in patches 527371/672491
|
|
self.assertEqual(re.match(r'(a)?a','a').lastindex, None)
|
|
self.assertEqual(re.match(r'(a)(b)?b','ab').lastindex, 1)
|
|
self.assertEqual(re.match(r'(?P<a>a)(?P<b>b)?b','ab').lastgroup, 'a')
|
|
self.assertEqual(re.match("(?P<a>a(b))", "ab").lastgroup, 'a')
|
|
self.assertEqual(re.match("((a))", "a").lastindex, 1)
|
|
|
|
def test_bug_545855(self):
|
|
# bug 545855 -- This pattern failed to cause a compile error as it
|
|
# should, instead provoking a TypeError.
|
|
self.assertRaises(re.error, re.compile, 'foo[a-')
|
|
|
|
def test_bug_418626(self):
|
|
# bugs 418626 at al. -- Testing Greg Chapman's addition of op code
|
|
# SRE_OP_MIN_REPEAT_ONE for eliminating recursion on simple uses of
|
|
# pattern '*?' on a long string.
|
|
self.assertEqual(re.match('.*?c', 10000*'ab'+'cd').end(0), 20001)
|
|
self.assertEqual(re.match('.*?cd', 5000*'ab'+'c'+5000*'ab'+'cde').end(0),
|
|
20003)
|
|
self.assertEqual(re.match('.*?cd', 20000*'abc'+'de').end(0), 60001)
|
|
# non-simple '*?' still used to hit the recursion limit, before the
|
|
# non-recursive scheme was implemented.
|
|
self.assertEqual(re.search('(a|b)*?c', 10000*'ab'+'cd').end(0), 20001)
|
|
|
|
def test_bug_612074(self):
|
|
pat="["+re.escape("\u2039")+"]"
|
|
self.assertEqual(re.compile(pat) and 1, 1)
|
|
|
|
def test_stack_overflow(self):
|
|
# nasty cases that used to overflow the straightforward recursive
|
|
# implementation of repeated groups.
|
|
self.assertEqual(re.match('(x)*', 50000*'x').group(1), 'x')
|
|
self.assertEqual(re.match('(x)*y', 50000*'x'+'y').group(1), 'x')
|
|
self.assertEqual(re.match('(x)*?y', 50000*'x'+'y').group(1), 'x')
|
|
|
|
def test_scanner(self):
|
|
def s_ident(scanner, token): return token
|
|
def s_operator(scanner, token): return "op%s" % token
|
|
def s_float(scanner, token): return float(token)
|
|
def s_int(scanner, token): return int(token)
|
|
|
|
scanner = Scanner([
|
|
(r"[a-zA-Z_]\w*", s_ident),
|
|
(r"\d+\.\d*", s_float),
|
|
(r"\d+", s_int),
|
|
(r"=|\+|-|\*|/", s_operator),
|
|
(r"\s+", None),
|
|
])
|
|
|
|
self.assertNotEqual(scanner.scanner.scanner("").pattern, None)
|
|
|
|
self.assertEqual(scanner.scan("sum = 3*foo + 312.50 + bar"),
|
|
(['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5,
|
|
'op+', 'bar'], ''))
|
|
|
|
def test_bug_448951(self):
|
|
# bug 448951 (similar to 429357, but with single char match)
|
|
# (Also test greedy matches.)
|
|
for op in '','?','*':
|
|
self.assertEqual(re.match(r'((.%s):)?z'%op, 'z').groups(),
|
|
(None, None))
|
|
self.assertEqual(re.match(r'((.%s):)?z'%op, 'a:z').groups(),
|
|
('a:', 'a'))
|
|
|
|
def test_bug_725106(self):
|
|
# capturing groups in alternatives in repeats
|
|
self.assertEqual(re.match('^((a)|b)*', 'abc').groups(),
|
|
('b', 'a'))
|
|
self.assertEqual(re.match('^(([ab])|c)*', 'abc').groups(),
|
|
('c', 'b'))
|
|
self.assertEqual(re.match('^((d)|[ab])*', 'abc').groups(),
|
|
('b', None))
|
|
self.assertEqual(re.match('^((a)c|[ab])*', 'abc').groups(),
|
|
('b', None))
|
|
self.assertEqual(re.match('^((a)|b)*?c', 'abc').groups(),
|
|
('b', 'a'))
|
|
self.assertEqual(re.match('^(([ab])|c)*?d', 'abcd').groups(),
|
|
('c', 'b'))
|
|
self.assertEqual(re.match('^((d)|[ab])*?c', 'abc').groups(),
|
|
('b', None))
|
|
self.assertEqual(re.match('^((a)c|[ab])*?c', 'abc').groups(),
|
|
('b', None))
|
|
|
|
def test_bug_725149(self):
|
|
# mark_stack_base restoring before restoring marks
|
|
self.assertEqual(re.match('(a)(?:(?=(b)*)c)*', 'abb').groups(),
|
|
('a', None))
|
|
self.assertEqual(re.match('(a)((?!(b)*))*', 'abb').groups(),
|
|
('a', None, None))
|
|
|
|
def test_bug_764548(self):
|
|
# bug 764548, re.compile() barfs on str/unicode subclasses
|
|
class my_unicode(str): pass
|
|
pat = re.compile(my_unicode("abc"))
|
|
self.assertEqual(pat.match("xyz"), None)
|
|
|
|
def test_finditer(self):
|
|
iter = re.finditer(r":+", "a:b::c:::d")
|
|
self.assertEqual([item.group(0) for item in iter],
|
|
[":", "::", ":::"])
|
|
|
|
def test_bug_926075(self):
|
|
self.assert_(re.compile('bug_926075') is not
|
|
re.compile(str8('bug_926075')))
|
|
|
|
def test_bug_931848(self):
|
|
pattern = eval('"[\u002E\u3002\uFF0E\uFF61]"')
|
|
self.assertEqual(re.compile(pattern).split("a.b.c"),
|
|
['a','b','c'])
|
|
|
|
def test_bug_581080(self):
|
|
iter = re.finditer(r"\s", "a b")
|
|
self.assertEqual(next(iter).span(), (1,2))
|
|
self.assertRaises(StopIteration, next, iter)
|
|
|
|
scanner = re.compile(r"\s").scanner("a b")
|
|
self.assertEqual(scanner.search().span(), (1, 2))
|
|
self.assertEqual(scanner.search(), None)
|
|
|
|
def test_bug_817234(self):
|
|
iter = re.finditer(r".*", "asdf")
|
|
self.assertEqual(next(iter).span(), (0, 4))
|
|
self.assertEqual(next(iter).span(), (4, 4))
|
|
self.assertRaises(StopIteration, next, iter)
|
|
|
|
def test_empty_array(self):
|
|
# SF buf 1647541
|
|
import array
|
|
for typecode in 'bBuhHiIlLfd':
|
|
a = array.array(typecode)
|
|
self.assertEqual(re.compile("bla").match(a), None)
|
|
self.assertEqual(re.compile("").match(a).groups(), ())
|
|
|
|
def run_re_tests():
|
|
from test.re_tests import benchmarks, tests, SUCCEED, FAIL, SYNTAX_ERROR
|
|
if verbose:
|
|
print('Running re_tests test suite')
|
|
else:
|
|
# To save time, only run the first and last 10 tests
|
|
#tests = tests[:10] + tests[-10:]
|
|
pass
|
|
|
|
for t in tests:
|
|
sys.stdout.flush()
|
|
pattern = s = outcome = repl = expected = None
|
|
if len(t) == 5:
|
|
pattern, s, outcome, repl, expected = t
|
|
elif len(t) == 3:
|
|
pattern, s, outcome = t
|
|
else:
|
|
raise ValueError('Test tuples should have 3 or 5 fields', t)
|
|
|
|
try:
|
|
obj = re.compile(pattern)
|
|
except re.error:
|
|
if outcome == SYNTAX_ERROR: pass # Expected a syntax error
|
|
else:
|
|
print('=== Syntax error:', t)
|
|
except KeyboardInterrupt: raise KeyboardInterrupt
|
|
except:
|
|
print('*** Unexpected error ***', t)
|
|
if verbose:
|
|
traceback.print_exc(file=sys.stdout)
|
|
else:
|
|
try:
|
|
result = obj.search(s)
|
|
except re.error as msg:
|
|
print('=== Unexpected exception', t, repr(msg))
|
|
if outcome == SYNTAX_ERROR:
|
|
# This should have been a syntax error; forget it.
|
|
pass
|
|
elif outcome == FAIL:
|
|
if result is None: pass # No match, as expected
|
|
else: print('=== Succeeded incorrectly', t)
|
|
elif outcome == SUCCEED:
|
|
if result is not None:
|
|
# Matched, as expected, so now we compute the
|
|
# result string and compare it to our expected result.
|
|
start, end = result.span(0)
|
|
vardict={'found': result.group(0),
|
|
'groups': result.group(),
|
|
'flags': result.re.flags}
|
|
for i in range(1, 100):
|
|
try:
|
|
gi = result.group(i)
|
|
# Special hack because else the string concat fails:
|
|
if gi is None:
|
|
gi = "None"
|
|
except IndexError:
|
|
gi = "Error"
|
|
vardict['g%d' % i] = gi
|
|
for i in result.re.groupindex.keys():
|
|
try:
|
|
gi = result.group(i)
|
|
if gi is None:
|
|
gi = "None"
|
|
except IndexError:
|
|
gi = "Error"
|
|
vardict[i] = gi
|
|
repl = eval(repl, vardict)
|
|
if repl != expected:
|
|
print('=== grouping error', t, end=' ')
|
|
print(repr(repl) + ' should be ' + repr(expected))
|
|
else:
|
|
print('=== Failed incorrectly', t)
|
|
|
|
# Try the match on a unicode string, and check that it
|
|
# still succeeds.
|
|
try:
|
|
result = obj.search(str(s, "latin-1"))
|
|
if result is None:
|
|
print('=== Fails on unicode match', t)
|
|
except NameError:
|
|
continue # 1.5.2
|
|
except TypeError:
|
|
continue # unicode test case
|
|
|
|
# Try the match on a unicode pattern, and check that it
|
|
# still succeeds.
|
|
obj=re.compile(str(pattern, "latin-1"))
|
|
result = obj.search(s)
|
|
if result is None:
|
|
print('=== Fails on unicode pattern match', t)
|
|
|
|
# Try the match with the search area limited to the extent
|
|
# of the match and see if it still succeeds. \B will
|
|
# break (because it won't match at the end or start of a
|
|
# string), so we'll ignore patterns that feature it.
|
|
|
|
if pattern[:2] != '\\B' and pattern[-2:] != '\\B' \
|
|
and result is not None:
|
|
obj = re.compile(pattern)
|
|
result = obj.search(s, result.start(0), result.end(0) + 1)
|
|
if result is None:
|
|
print('=== Failed on range-limited match', t)
|
|
|
|
# Try the match with IGNORECASE enabled, and check that it
|
|
# still succeeds.
|
|
obj = re.compile(pattern, re.IGNORECASE)
|
|
result = obj.search(s)
|
|
if result is None:
|
|
print('=== Fails on case-insensitive match', t)
|
|
|
|
# Try the match with LOCALE enabled, and check that it
|
|
# still succeeds.
|
|
obj = re.compile(pattern, re.LOCALE)
|
|
result = obj.search(s)
|
|
if result is None:
|
|
print('=== Fails on locale-sensitive match', t)
|
|
|
|
# Try the match with UNICODE locale enabled, and check
|
|
# that it still succeeds.
|
|
obj = re.compile(pattern, re.UNICODE)
|
|
result = obj.search(s)
|
|
if result is None:
|
|
print('=== Fails on unicode-sensitive match', t)
|
|
|
|
def test_main():
|
|
run_unittest(ReTests)
|
|
run_re_tests()
|
|
|
|
if __name__ == "__main__":
|
|
test_main()
|