blob: 60b816ee2ca9f213c48365bf114443233561cdf2 [file] [log] [blame]
Guido van Rossum8430c581998-04-03 21:47:12 +00001import sys
Fred Drake8ae9ce52000-08-18 16:09:56 +00002sys.path = ['.'] + sys.path
Guido van Rossum8430c581998-04-03 21:47:12 +00003
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test.support import verbose, run_unittest, catch_warning
Guido van Rossum8e0ce301997-07-11 19:34:44 +00005import re
Thomas Wouters9ada3d62006-04-21 09:47:09 +00006from re import Scanner
Eric S. Raymond2846b0a2001-02-09 12:00:47 +00007import sys, os, traceback
Raymond Hettinger027bb632004-05-31 03:09:25 +00008from weakref import proxy
Guido van Rossum8e0ce301997-07-11 19:34:44 +00009
Guido van Rossum23b22571997-07-17 22:36:14 +000010# Misc tests from Tim Peters' re.doc
11
Just van Rossum6802c6e2003-07-02 14:36:59 +000012# WARNING: Don't change details in these tests if you don't know
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +000013# what you're doing. Some of these tests were carefuly modeled to
14# cover most of the code.
15
Skip Montanaro8ed06da2003-04-24 19:43:18 +000016import unittest
Guido van Rossum8430c581998-04-03 21:47:12 +000017
Skip Montanaro8ed06da2003-04-24 19:43:18 +000018class ReTests(unittest.TestCase):
Raymond Hettinger027bb632004-05-31 03:09:25 +000019
20 def test_weakref(self):
21 s = 'QabbbcR'
22 x = re.compile('ab+c')
23 y = proxy(x)
24 self.assertEqual(x.findall('QabbbcR'), y.findall('QabbbcR'))
25
Skip Montanaro8ed06da2003-04-24 19:43:18 +000026 def test_search_star_plus(self):
27 self.assertEqual(re.search('x*', 'axx').span(0), (0, 0))
28 self.assertEqual(re.search('x*', 'axx').span(), (0, 0))
29 self.assertEqual(re.search('x+', 'axx').span(0), (1, 3))
30 self.assertEqual(re.search('x+', 'axx').span(), (1, 3))
Skip Montanaro5ba00542003-04-25 16:00:14 +000031 self.assertEqual(re.search('x', 'aaa'), None)
Skip Montanaro8ed06da2003-04-24 19:43:18 +000032 self.assertEqual(re.match('a*', 'xxx').span(0), (0, 0))
33 self.assertEqual(re.match('a*', 'xxx').span(), (0, 0))
34 self.assertEqual(re.match('x*', 'xxxa').span(0), (0, 3))
35 self.assertEqual(re.match('x*', 'xxxa').span(), (0, 3))
Skip Montanaro5ba00542003-04-25 16:00:14 +000036 self.assertEqual(re.match('a+', 'xxx'), None)
Guido van Rossum8430c581998-04-03 21:47:12 +000037
Skip Montanaro8ed06da2003-04-24 19:43:18 +000038 def bump_num(self, matchobj):
Guido van Rossum41360a41998-03-26 19:42:58 +000039 int_value = int(matchobj.group(0))
40 return str(int_value + 1)
Guido van Rossum23b22571997-07-17 22:36:14 +000041
Skip Montanaro8ed06da2003-04-24 19:43:18 +000042 def test_basic_re_sub(self):
43 self.assertEqual(re.sub("(?i)b+", "x", "bbbb BBBB"), 'x x')
44 self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'),
45 '9.3 -3 24x100y')
46 self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3),
47 '9.3 -3 23x99y')
Fredrik Lundh1151a8c2000-08-08 16:47:42 +000048
Skip Montanaro8ed06da2003-04-24 19:43:18 +000049 self.assertEqual(re.sub('.', lambda m: r"\n", 'x'), '\\n')
50 self.assertEqual(re.sub('.', r"\n", 'x'), '\n')
Guido van Rossumdfa67901997-12-08 17:12:06 +000051
Skip Montanaro8ed06da2003-04-24 19:43:18 +000052 s = r"\1\1"
53 self.assertEqual(re.sub('(.)', s, 'x'), 'xx')
54 self.assertEqual(re.sub('(.)', re.escape(s), 'x'), s)
55 self.assertEqual(re.sub('(.)', lambda m: s, 'x'), s)
Guido van Rossum23b22571997-07-17 22:36:14 +000056
Skip Montanaro8ed06da2003-04-24 19:43:18 +000057 self.assertEqual(re.sub('(?P<a>x)', '\g<a>\g<a>', 'xx'), 'xxxx')
58 self.assertEqual(re.sub('(?P<a>x)', '\g<a>\g<1>', 'xx'), 'xxxx')
59 self.assertEqual(re.sub('(?P<unk>x)', '\g<unk>\g<unk>', 'xx'), 'xxxx')
60 self.assertEqual(re.sub('(?P<unk>x)', '\g<1>\g<1>', 'xx'), 'xxxx')
Guido van Rossum49946571997-07-18 04:26:25 +000061
Skip Montanaro8ed06da2003-04-24 19:43:18 +000062 self.assertEqual(re.sub('a',r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D','a'),
63 '\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D')
64 self.assertEqual(re.sub('a', '\t\n\v\r\f\a', 'a'), '\t\n\v\r\f\a')
65 self.assertEqual(re.sub('a', '\t\n\v\r\f\a', 'a'),
66 (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)))
Guido van Rossum95e80531997-08-13 22:34:14 +000067
Skip Montanaro8ed06da2003-04-24 19:43:18 +000068 self.assertEqual(re.sub('^\s*', 'X', 'test'), 'Xtest')
Guido van Rossume056e4d2001-08-10 14:52:48 +000069
Skip Montanaro2726fcd2003-04-25 14:31:54 +000070 def test_bug_449964(self):
71 # fails for group followed by other escape
72 self.assertEqual(re.sub(r'(?P<unk>x)', '\g<1>\g<1>\\b', 'xx'),
73 'xx\bxx\b')
74
75 def test_bug_449000(self):
76 # Test for sub() on escaped characters
Skip Montanaro8ed06da2003-04-24 19:43:18 +000077 self.assertEqual(re.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n'),
78 'abc\ndef\n')
79 self.assertEqual(re.sub('\r\n', r'\n', 'abc\r\ndef\r\n'),
80 'abc\ndef\n')
81 self.assertEqual(re.sub(r'\r\n', '\n', 'abc\r\ndef\r\n'),
82 'abc\ndef\n')
83 self.assertEqual(re.sub('\r\n', '\n', 'abc\r\ndef\r\n'),
84 'abc\ndef\n')
Guido van Rossum23b22571997-07-17 22:36:14 +000085
Thomas Wouters40a088d2008-03-18 20:19:54 +000086 def test_bug_1140(self):
87 # re.sub(x, y, b'') should return b'', not '', and
88 # re.sub(x, y, '') should return '', not b''.
89 # Also:
90 # re.sub(x, y, str(x)) should return str(y), and
91 # re.sub(x, y, bytes(x)) should return
92 # str(y) if isinstance(y, str) else unicode(y).
93 for x in 'x', b'x':
94 for y in 'y', b'y':
95 z = re.sub(x, y, b'')
96 self.assertEqual(z, b'')
97 self.assertEqual(type(z), bytes)
98 #
99 z = re.sub(x, y, '')
100 self.assertEqual(z, '')
101 self.assertEqual(type(z), str)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000102
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000103 def test_bug_1661(self):
104 # Verify that flags do not get silently ignored with compiled patterns
105 pattern = re.compile('.')
106 self.assertRaises(ValueError, re.match, pattern, 'A', re.I)
107 self.assertRaises(ValueError, re.search, pattern, 'A', re.I)
108 self.assertRaises(ValueError, re.findall, pattern, 'A', re.I)
109 self.assertRaises(ValueError, re.compile, pattern, re.I)
110
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000111 def test_sub_template_numeric_escape(self):
112 # bug 776311 and friends
113 self.assertEqual(re.sub('x', r'\0', 'x'), '\0')
114 self.assertEqual(re.sub('x', r'\000', 'x'), '\000')
115 self.assertEqual(re.sub('x', r'\001', 'x'), '\001')
116 self.assertEqual(re.sub('x', r'\008', 'x'), '\0' + '8')
117 self.assertEqual(re.sub('x', r'\009', 'x'), '\0' + '9')
118 self.assertEqual(re.sub('x', r'\111', 'x'), '\111')
119 self.assertEqual(re.sub('x', r'\117', 'x'), '\117')
120
121 self.assertEqual(re.sub('x', r'\1111', 'x'), '\1111')
122 self.assertEqual(re.sub('x', r'\1111', 'x'), '\111' + '1')
123
124 self.assertEqual(re.sub('x', r'\00', 'x'), '\x00')
125 self.assertEqual(re.sub('x', r'\07', 'x'), '\x07')
126 self.assertEqual(re.sub('x', r'\08', 'x'), '\0' + '8')
127 self.assertEqual(re.sub('x', r'\09', 'x'), '\0' + '9')
128 self.assertEqual(re.sub('x', r'\0a', 'x'), '\0' + 'a')
129
130 self.assertEqual(re.sub('x', r'\400', 'x'), '\0')
131 self.assertEqual(re.sub('x', r'\777', 'x'), '\377')
Tim Peters0e9980f2004-09-12 03:49:31 +0000132
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000133 self.assertRaises(re.error, re.sub, 'x', r'\1', 'x')
134 self.assertRaises(re.error, re.sub, 'x', r'\8', 'x')
135 self.assertRaises(re.error, re.sub, 'x', r'\9', 'x')
136 self.assertRaises(re.error, re.sub, 'x', r'\11', 'x')
137 self.assertRaises(re.error, re.sub, 'x', r'\18', 'x')
138 self.assertRaises(re.error, re.sub, 'x', r'\1a', 'x')
139 self.assertRaises(re.error, re.sub, 'x', r'\90', 'x')
140 self.assertRaises(re.error, re.sub, 'x', r'\99', 'x')
141 self.assertRaises(re.error, re.sub, 'x', r'\118', 'x') # r'\11' + '8'
142 self.assertRaises(re.error, re.sub, 'x', r'\11a', 'x')
143 self.assertRaises(re.error, re.sub, 'x', r'\181', 'x') # r'\18' + '1'
144 self.assertRaises(re.error, re.sub, 'x', r'\800', 'x') # r'\80' + '0'
145
146 # in python2.3 (etc), these loop endlessly in sre_parser.py
147 self.assertEqual(re.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x')
148 self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\118', 'xyz'),
149 'xz8')
150 self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\11a', 'xyz'),
151 'xza')
152
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000153 def test_qualified_re_sub(self):
154 self.assertEqual(re.sub('a', 'b', 'aaaaa'), 'bbbbb')
155 self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa')
Guido van Rossum8430c581998-04-03 21:47:12 +0000156
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000157 def test_bug_114660(self):
158 self.assertEqual(re.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'),
159 'hello there')
160
161 def test_bug_462270(self):
162 # Test for empty sub() behaviour, see SF bug #462270
163 self.assertEqual(re.sub('x*', '-', 'abxd'), '-a-b-d-')
164 self.assertEqual(re.sub('x+', '-', 'abxd'), 'ab-d')
165
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000166 def test_symbolic_refs(self):
167 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a', 'xx')
168 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<', 'xx')
169 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g', 'xx')
170 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a a>', 'xx')
171 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<1a1>', 'xx')
172 self.assertRaises(IndexError, re.sub, '(?P<a>x)', '\g<ab>', 'xx')
173 self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')
174 self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\\2', 'xx')
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000175 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<-1>', 'xx')
Guido van Rossumf473cb01998-01-14 16:42:17 +0000176
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000177 def test_re_subn(self):
178 self.assertEqual(re.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2))
179 self.assertEqual(re.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1))
180 self.assertEqual(re.subn("b+", "x", "xyz"), ('xyz', 0))
181 self.assertEqual(re.subn("b*", "x", "xyz"), ('xxxyxzx', 4))
182 self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2))
Guido van Rossum49946571997-07-18 04:26:25 +0000183
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000184 def test_re_split(self):
185 self.assertEqual(re.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c'])
186 self.assertEqual(re.split(":*", ":a:b::c"), ['', 'a', 'b', 'c'])
187 self.assertEqual(re.split("(:*)", ":a:b::c"),
188 ['', ':', 'a', ':', 'b', '::', 'c'])
189 self.assertEqual(re.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c'])
190 self.assertEqual(re.split("(:)*", ":a:b::c"),
191 ['', ':', 'a', ':', 'b', ':', 'c'])
192 self.assertEqual(re.split("([b:]+)", ":a:b::c"),
193 ['', ':', 'a', ':b::', 'c'])
194 self.assertEqual(re.split("(b)|(:+)", ":a:b::c"),
195 ['', None, ':', 'a', None, ':', '', 'b', None, '',
196 None, '::', 'c'])
197 self.assertEqual(re.split("(?:b)|(?::+)", ":a:b::c"),
198 ['', 'a', '', '', 'c'])
Guido van Rossum49946571997-07-18 04:26:25 +0000199
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000200 def test_qualified_re_split(self):
201 self.assertEqual(re.split(":", ":a:b::c", 2), ['', 'a', 'b::c'])
202 self.assertEqual(re.split(':', 'a:b:c:d', 2), ['a', 'b', 'c:d'])
203 self.assertEqual(re.split("(:)", ":a:b::c", 2),
204 ['', ':', 'a', ':', 'b::c'])
205 self.assertEqual(re.split("(:*)", ":a:b::c", 2),
206 ['', ':', 'a', ':', 'b::c'])
Guido van Rossum49946571997-07-18 04:26:25 +0000207
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000208 def test_re_findall(self):
209 self.assertEqual(re.findall(":+", "abc"), [])
210 self.assertEqual(re.findall(":+", "a:b::c:::d"), [":", "::", ":::"])
211 self.assertEqual(re.findall("(:+)", "a:b::c:::d"), [":", "::", ":::"])
212 self.assertEqual(re.findall("(:)(:*)", "a:b::c:::d"), [(":", ""),
213 (":", ":"),
214 (":", "::")])
Guido van Rossum49946571997-07-18 04:26:25 +0000215
Skip Montanaro5ba00542003-04-25 16:00:14 +0000216 def test_bug_117612(self):
217 self.assertEqual(re.findall(r"(a|(b))", "aba"),
218 [("a", ""),("b", "b"),("a", "")])
219
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000220 def test_re_match(self):
Skip Montanaro5ba00542003-04-25 16:00:14 +0000221 self.assertEqual(re.match('a', 'a').groups(), ())
222 self.assertEqual(re.match('(a)', 'a').groups(), ('a',))
223 self.assertEqual(re.match(r'(a)', 'a').group(0), 'a')
224 self.assertEqual(re.match(r'(a)', 'a').group(1), 'a')
225 self.assertEqual(re.match(r'(a)', 'a').group(1, 1), ('a', 'a'))
Guido van Rossum49946571997-07-18 04:26:25 +0000226
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000227 pat = re.compile('((a)|(b))(c)?')
228 self.assertEqual(pat.match('a').groups(), ('a', 'a', None, None))
229 self.assertEqual(pat.match('b').groups(), ('b', None, 'b', None))
230 self.assertEqual(pat.match('ac').groups(), ('a', 'a', None, 'c'))
231 self.assertEqual(pat.match('bc').groups(), ('b', None, 'b', 'c'))
232 self.assertEqual(pat.match('bc').groups(""), ('b', "", 'b', 'c'))
Guido van Rossum8430c581998-04-03 21:47:12 +0000233
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000234 # A single group
235 m = re.match('(a)', 'a')
236 self.assertEqual(m.group(0), 'a')
237 self.assertEqual(m.group(0), 'a')
238 self.assertEqual(m.group(1), 'a')
239 self.assertEqual(m.group(1, 1), ('a', 'a'))
Guido van Rossum49946571997-07-18 04:26:25 +0000240
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000241 pat = re.compile('(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?')
242 self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None))
243 self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'),
244 (None, 'b', None))
245 self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c'))
Guido van Rossum49946571997-07-18 04:26:25 +0000246
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000247 def test_re_groupref_exists(self):
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000248 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a)').groups(),
249 ('(', 'a'))
250 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a').groups(),
251 (None, 'a'))
252 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a)'), None)
253 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a'), None)
254 self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'ab').groups(),
255 ('a', 'b'))
256 self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'cd').groups(),
257 (None, 'd'))
258 self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'cd').groups(),
259 (None, 'd'))
260 self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'a').groups(),
261 ('a', ''))
262
Michael W. Hudsone7fa1af2005-06-03 13:55:58 +0000263 # Tests for bug #1177831: exercise groups other than the first group
264 p = re.compile('(?P<g1>a)(?P<g2>b)?((?(g2)c|d))')
265 self.assertEqual(p.match('abc').groups(),
266 ('a', 'b', 'c'))
267 self.assertEqual(p.match('ad').groups(),
268 ('a', None, 'd'))
269 self.assertEqual(p.match('abd'), None)
270 self.assertEqual(p.match('ac'), None)
271
Andrew M. Kuchling3554cad2005-06-02 13:38:45 +0000272
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000273 def test_re_groupref(self):
274 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a|').groups(),
275 ('|', 'a'))
276 self.assertEqual(re.match(r'^(\|)?([^()]+)\1?$', 'a').groups(),
277 (None, 'a'))
278 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', 'a|'), None)
279 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a'), None)
280 self.assertEqual(re.match(r'^(?:(a)|c)(\1)$', 'aa').groups(),
281 ('a', 'a'))
282 self.assertEqual(re.match(r'^(?:(a)|c)(\1)?$', 'c').groups(),
283 (None, None))
284
285 def test_groupdict(self):
286 self.assertEqual(re.match('(?P<first>first) (?P<second>second)',
287 'first second').groupdict(),
288 {'first':'first', 'second':'second'})
289
290 def test_expand(self):
291 self.assertEqual(re.match("(?P<first>first) (?P<second>second)",
292 "first second")
293 .expand(r"\2 \1 \g<second> \g<first>"),
294 "second first second first")
295
296 def test_repeat_minmax(self):
297 self.assertEqual(re.match("^(\w){1}$", "abc"), None)
298 self.assertEqual(re.match("^(\w){1}?$", "abc"), None)
299 self.assertEqual(re.match("^(\w){1,2}$", "abc"), None)
300 self.assertEqual(re.match("^(\w){1,2}?$", "abc"), None)
301
302 self.assertEqual(re.match("^(\w){3}$", "abc").group(1), "c")
303 self.assertEqual(re.match("^(\w){1,3}$", "abc").group(1), "c")
304 self.assertEqual(re.match("^(\w){1,4}$", "abc").group(1), "c")
305 self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
306 self.assertEqual(re.match("^(\w){3}?$", "abc").group(1), "c")
307 self.assertEqual(re.match("^(\w){1,3}?$", "abc").group(1), "c")
308 self.assertEqual(re.match("^(\w){1,4}?$", "abc").group(1), "c")
309 self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
310
311 self.assertEqual(re.match("^x{1}$", "xxx"), None)
312 self.assertEqual(re.match("^x{1}?$", "xxx"), None)
313 self.assertEqual(re.match("^x{1,2}$", "xxx"), None)
314 self.assertEqual(re.match("^x{1,2}?$", "xxx"), None)
315
316 self.assertNotEqual(re.match("^x{3}$", "xxx"), None)
317 self.assertNotEqual(re.match("^x{1,3}$", "xxx"), None)
318 self.assertNotEqual(re.match("^x{1,4}$", "xxx"), None)
319 self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
320 self.assertNotEqual(re.match("^x{3}?$", "xxx"), None)
321 self.assertNotEqual(re.match("^x{1,3}?$", "xxx"), None)
322 self.assertNotEqual(re.match("^x{1,4}?$", "xxx"), None)
323 self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
324
Gustavo Niemeyer6fa0c5a2005-09-14 08:54:39 +0000325 self.assertEqual(re.match("^x{}$", "xxx"), None)
326 self.assertNotEqual(re.match("^x{}$", "x{}"), None)
327
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000328 def test_getattr(self):
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000329 self.assertEqual(re.compile("(?i)(a)(b)").pattern, "(?i)(a)(b)")
330 self.assertEqual(re.compile("(?i)(a)(b)").flags, re.I)
331 self.assertEqual(re.compile("(?i)(a)(b)").groups, 2)
332 self.assertEqual(re.compile("(?i)(a)(b)").groupindex, {})
333 self.assertEqual(re.compile("(?i)(?P<first>a)(?P<other>b)").groupindex,
334 {'first': 1, 'other': 2})
335
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000336 self.assertEqual(re.match("(a)", "a").pos, 0)
337 self.assertEqual(re.match("(a)", "a").endpos, 1)
338 self.assertEqual(re.match("(a)", "a").string, "a")
339 self.assertEqual(re.match("(a)", "a").regs, ((0, 1), (0, 1)))
340 self.assertNotEqual(re.match("(a)", "a").re, None)
341
342 def test_special_escapes(self):
343 self.assertEqual(re.search(r"\b(b.)\b",
344 "abcd abc bcd bx").group(1), "bx")
345 self.assertEqual(re.search(r"\B(b.)\B",
346 "abc bcd bc abxd").group(1), "bx")
347 self.assertEqual(re.search(r"\b(b.)\b",
348 "abcd abc bcd bx", re.LOCALE).group(1), "bx")
349 self.assertEqual(re.search(r"\B(b.)\B",
350 "abc bcd bc abxd", re.LOCALE).group(1), "bx")
351 self.assertEqual(re.search(r"\b(b.)\b",
352 "abcd abc bcd bx", re.UNICODE).group(1), "bx")
353 self.assertEqual(re.search(r"\B(b.)\B",
354 "abc bcd bc abxd", re.UNICODE).group(1), "bx")
355 self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
356 self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
357 self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
358 self.assertEqual(re.search(r"\b(b.)\b",
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000359 "abcd abc bcd bx").group(1), "bx")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000360 self.assertEqual(re.search(r"\B(b.)\B",
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000361 "abc bcd bc abxd").group(1), "bx")
362 self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
363 self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
364 self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000365 self.assertEqual(re.search(r"\d\D\w\W\s\S",
366 "1aa! a").group(0), "1aa! a")
367 self.assertEqual(re.search(r"\d\D\w\W\s\S",
368 "1aa! a", re.LOCALE).group(0), "1aa! a")
369 self.assertEqual(re.search(r"\d\D\w\W\s\S",
370 "1aa! a", re.UNICODE).group(0), "1aa! a")
371
372 def test_ignore_case(self):
373 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000374 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000375
376 def test_bigcharset(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000377 self.assertEqual(re.match("([\u2222\u2223])",
378 "\u2222").group(1), "\u2222")
379 self.assertEqual(re.match("([\u2222\u2223])",
380 "\u2222", re.UNICODE).group(1), "\u2222")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000381
382 def test_anyall(self):
383 self.assertEqual(re.match("a.b", "a\nb", re.DOTALL).group(0),
384 "a\nb")
385 self.assertEqual(re.match("a.*b", "a\n\nb", re.DOTALL).group(0),
386 "a\n\nb")
387
388 def test_non_consuming(self):
389 self.assertEqual(re.match("(a(?=\s[^a]))", "a b").group(1), "a")
390 self.assertEqual(re.match("(a(?=\s[^a]*))", "a b").group(1), "a")
391 self.assertEqual(re.match("(a(?=\s[abc]))", "a b").group(1), "a")
392 self.assertEqual(re.match("(a(?=\s[abc]*))", "a bc").group(1), "a")
393 self.assertEqual(re.match(r"(a)(?=\s\1)", "a a").group(1), "a")
394 self.assertEqual(re.match(r"(a)(?=\s\1*)", "a aa").group(1), "a")
395 self.assertEqual(re.match(r"(a)(?=\s(abc|a))", "a a").group(1), "a")
396
397 self.assertEqual(re.match(r"(a(?!\s[^a]))", "a a").group(1), "a")
398 self.assertEqual(re.match(r"(a(?!\s[abc]))", "a d").group(1), "a")
399 self.assertEqual(re.match(r"(a)(?!\s\1)", "a b").group(1), "a")
400 self.assertEqual(re.match(r"(a)(?!\s(abc|a))", "a b").group(1), "a")
401
402 def test_ignore_case(self):
403 self.assertEqual(re.match(r"(a\s[^a])", "a b", re.I).group(1), "a b")
404 self.assertEqual(re.match(r"(a\s[^a]*)", "a bb", re.I).group(1), "a bb")
405 self.assertEqual(re.match(r"(a\s[abc])", "a b", re.I).group(1), "a b")
406 self.assertEqual(re.match(r"(a\s[abc]*)", "a bb", re.I).group(1), "a bb")
407 self.assertEqual(re.match(r"((a)\s\2)", "a a", re.I).group(1), "a a")
408 self.assertEqual(re.match(r"((a)\s\2*)", "a aa", re.I).group(1), "a aa")
409 self.assertEqual(re.match(r"((a)\s(abc|a))", "a a", re.I).group(1), "a a")
410 self.assertEqual(re.match(r"((a)\s(abc|a)*)", "a aa", re.I).group(1), "a aa")
411
412 def test_category(self):
413 self.assertEqual(re.match(r"(\s)", " ").group(1), " ")
414
415 def test_getlower(self):
416 import _sre
417 self.assertEqual(_sre.getlower(ord('A'), 0), ord('a'))
418 self.assertEqual(_sre.getlower(ord('A'), re.LOCALE), ord('a'))
419 self.assertEqual(_sre.getlower(ord('A'), re.UNICODE), ord('a'))
420
421 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000422 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000423
424 def test_not_literal(self):
425 self.assertEqual(re.search("\s([^a])", " b").group(1), "b")
426 self.assertEqual(re.search("\s([^a]*)", " bb").group(1), "bb")
427
428 def test_search_coverage(self):
429 self.assertEqual(re.search("\s(b)", " b").group(1), "b")
430 self.assertEqual(re.search("a\s", "a ").group(0), "a ")
431
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000432 def test_re_escape(self):
433 p=""
434 for i in range(0, 256):
435 p = p + chr(i)
436 self.assertEqual(re.match(re.escape(chr(i)), chr(i)) is not None,
437 True)
438 self.assertEqual(re.match(re.escape(chr(i)), chr(i)).span(), (0,1))
Guido van Rossum49946571997-07-18 04:26:25 +0000439
Skip Montanaro1e703c62003-04-25 15:40:28 +0000440 pat=re.compile(re.escape(p))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000441 self.assertEqual(pat.match(p) is not None, True)
442 self.assertEqual(pat.match(p).span(), (0,256))
Guido van Rossum49946571997-07-18 04:26:25 +0000443
Skip Montanaro1e703c62003-04-25 15:40:28 +0000444 def pickle_test(self, pickle):
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000445 oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')
446 s = pickle.dumps(oldpat)
447 newpat = pickle.loads(s)
448 self.assertEqual(oldpat, newpat)
Guido van Rossum23b22571997-07-17 22:36:14 +0000449
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000450 def test_constants(self):
451 self.assertEqual(re.I, re.IGNORECASE)
452 self.assertEqual(re.L, re.LOCALE)
453 self.assertEqual(re.M, re.MULTILINE)
454 self.assertEqual(re.S, re.DOTALL)
455 self.assertEqual(re.X, re.VERBOSE)
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000456
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000457 def test_flags(self):
Skip Montanaro1e703c62003-04-25 15:40:28 +0000458 for flag in [re.I, re.M, re.X, re.S, re.L]:
459 self.assertNotEqual(re.compile('^pattern$', flag), None)
Guido van Rossumf473cb01998-01-14 16:42:17 +0000460
Skip Montanaro7d9963f2003-04-25 14:12:40 +0000461 def test_sre_character_literals(self):
462 for i in [0, 8, 16, 32, 64, 127, 128, 255]:
463 self.assertNotEqual(re.match(r"\%03o" % i, chr(i)), None)
464 self.assertNotEqual(re.match(r"\%03o0" % i, chr(i)+"0"), None)
465 self.assertNotEqual(re.match(r"\%03o8" % i, chr(i)+"8"), None)
466 self.assertNotEqual(re.match(r"\x%02x" % i, chr(i)), None)
467 self.assertNotEqual(re.match(r"\x%02x0" % i, chr(i)+"0"), None)
468 self.assertNotEqual(re.match(r"\x%02xz" % i, chr(i)+"z"), None)
469 self.assertRaises(re.error, re.match, "\911", "")
470
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000471 def test_sre_character_class_literals(self):
472 for i in [0, 8, 16, 32, 64, 127, 128, 255]:
473 self.assertNotEqual(re.match(r"[\%03o]" % i, chr(i)), None)
474 self.assertNotEqual(re.match(r"[\%03o0]" % i, chr(i)), None)
475 self.assertNotEqual(re.match(r"[\%03o8]" % i, chr(i)), None)
476 self.assertNotEqual(re.match(r"[\x%02x]" % i, chr(i)), None)
477 self.assertNotEqual(re.match(r"[\x%02x0]" % i, chr(i)), None)
478 self.assertNotEqual(re.match(r"[\x%02xz]" % i, chr(i)), None)
479 self.assertRaises(re.error, re.match, "[\911]", "")
480
Skip Montanaro7d9963f2003-04-25 14:12:40 +0000481 def test_bug_113254(self):
482 self.assertEqual(re.match(r'(a)|(b)', 'b').start(1), -1)
483 self.assertEqual(re.match(r'(a)|(b)', 'b').end(1), -1)
484 self.assertEqual(re.match(r'(a)|(b)', 'b').span(1), (-1, -1))
485
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000486 def test_bug_527371(self):
487 # bug described in patches 527371/672491
488 self.assertEqual(re.match(r'(a)?a','a').lastindex, None)
489 self.assertEqual(re.match(r'(a)(b)?b','ab').lastindex, 1)
490 self.assertEqual(re.match(r'(?P<a>a)(?P<b>b)?b','ab').lastgroup, 'a')
491 self.assertEqual(re.match("(?P<a>a(b))", "ab").lastgroup, 'a')
492 self.assertEqual(re.match("((a))", "a").lastindex, 1)
493
494 def test_bug_545855(self):
495 # bug 545855 -- This pattern failed to cause a compile error as it
496 # should, instead provoking a TypeError.
497 self.assertRaises(re.error, re.compile, 'foo[a-')
498
499 def test_bug_418626(self):
500 # bugs 418626 at al. -- Testing Greg Chapman's addition of op code
501 # SRE_OP_MIN_REPEAT_ONE for eliminating recursion on simple uses of
502 # pattern '*?' on a long string.
503 self.assertEqual(re.match('.*?c', 10000*'ab'+'cd').end(0), 20001)
504 self.assertEqual(re.match('.*?cd', 5000*'ab'+'c'+5000*'ab'+'cde').end(0),
505 20003)
506 self.assertEqual(re.match('.*?cd', 20000*'abc'+'de').end(0), 60001)
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000507 # non-simple '*?' still used to hit the recursion limit, before the
Tim Peters58eb11c2004-01-18 20:29:55 +0000508 # non-recursive scheme was implemented.
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000509 self.assertEqual(re.search('(a|b)*?c', 10000*'ab'+'cd').end(0), 20001)
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000510
511 def test_bug_612074(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000512 pat="["+re.escape("\u2039")+"]"
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000513 self.assertEqual(re.compile(pat) and 1, 1)
514
Skip Montanaro1e703c62003-04-25 15:40:28 +0000515 def test_stack_overflow(self):
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000516 # nasty cases that used to overflow the straightforward recursive
Skip Montanaro1e703c62003-04-25 15:40:28 +0000517 # implementation of repeated groups.
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000518 self.assertEqual(re.match('(x)*', 50000*'x').group(1), 'x')
519 self.assertEqual(re.match('(x)*y', 50000*'x'+'y').group(1), 'x')
520 self.assertEqual(re.match('(x)*?y', 50000*'x'+'y').group(1), 'x')
Skip Montanaro1e703c62003-04-25 15:40:28 +0000521
522 def test_scanner(self):
523 def s_ident(scanner, token): return token
524 def s_operator(scanner, token): return "op%s" % token
525 def s_float(scanner, token): return float(token)
526 def s_int(scanner, token): return int(token)
527
528 scanner = Scanner([
529 (r"[a-zA-Z_]\w*", s_ident),
530 (r"\d+\.\d*", s_float),
531 (r"\d+", s_int),
532 (r"=|\+|-|\*|/", s_operator),
533 (r"\s+", None),
534 ])
535
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000536 self.assertNotEqual(scanner.scanner.scanner("").pattern, None)
537
Skip Montanaro1e703c62003-04-25 15:40:28 +0000538 self.assertEqual(scanner.scan("sum = 3*foo + 312.50 + bar"),
539 (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5,
540 'op+', 'bar'], ''))
541
Skip Montanaro5ba00542003-04-25 16:00:14 +0000542 def test_bug_448951(self):
543 # bug 448951 (similar to 429357, but with single char match)
544 # (Also test greedy matches.)
545 for op in '','?','*':
546 self.assertEqual(re.match(r'((.%s):)?z'%op, 'z').groups(),
547 (None, None))
548 self.assertEqual(re.match(r'((.%s):)?z'%op, 'a:z').groups(),
549 ('a:', 'a'))
550
Gustavo Niemeyerc34f2552003-04-27 12:34:14 +0000551 def test_bug_725106(self):
552 # capturing groups in alternatives in repeats
553 self.assertEqual(re.match('^((a)|b)*', 'abc').groups(),
554 ('b', 'a'))
555 self.assertEqual(re.match('^(([ab])|c)*', 'abc').groups(),
556 ('c', 'b'))
557 self.assertEqual(re.match('^((d)|[ab])*', 'abc').groups(),
558 ('b', None))
559 self.assertEqual(re.match('^((a)c|[ab])*', 'abc').groups(),
560 ('b', None))
561 self.assertEqual(re.match('^((a)|b)*?c', 'abc').groups(),
562 ('b', 'a'))
563 self.assertEqual(re.match('^(([ab])|c)*?d', 'abcd').groups(),
564 ('c', 'b'))
565 self.assertEqual(re.match('^((d)|[ab])*?c', 'abc').groups(),
566 ('b', None))
567 self.assertEqual(re.match('^((a)c|[ab])*?c', 'abc').groups(),
568 ('b', None))
569
Gustavo Niemeyer3646ab92003-04-27 13:25:21 +0000570 def test_bug_725149(self):
571 # mark_stack_base restoring before restoring marks
572 self.assertEqual(re.match('(a)(?:(?=(b)*)c)*', 'abb').groups(),
573 ('a', None))
574 self.assertEqual(re.match('(a)((?!(b)*))*', 'abb').groups(),
575 ('a', None, None))
576
Just van Rossum12723ba2003-07-02 20:03:04 +0000577 def test_bug_764548(self):
578 # bug 764548, re.compile() barfs on str/unicode subclasses
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000579 class my_unicode(str): pass
Just van Rossum12723ba2003-07-02 20:03:04 +0000580 pat = re.compile(my_unicode("abc"))
581 self.assertEqual(pat.match("xyz"), None)
582
Skip Montanaro5ba00542003-04-25 16:00:14 +0000583 def test_finditer(self):
584 iter = re.finditer(r":+", "a:b::c:::d")
585 self.assertEqual([item.group(0) for item in iter],
586 [":", "::", ":::"])
587
Thomas Wouters40a088d2008-03-18 20:19:54 +0000588 def test_bug_926075(self):
589 self.assert_(re.compile('bug_926075') is not
590 re.compile(b'bug_926075'))
Hye-Shik Chang9f62ecc2004-04-20 21:30:07 +0000591
Martin v. Löwis7d9c6c72004-05-07 07:18:13 +0000592 def test_bug_931848(self):
Guido van Rossum7ebb9702007-05-15 21:39:58 +0000593 pattern = eval('"[\u002E\u3002\uFF0E\uFF61]"')
Martin v. Löwis7d9c6c72004-05-07 07:18:13 +0000594 self.assertEqual(re.compile(pattern).split("a.b.c"),
595 ['a','b','c'])
596
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000597 def test_bug_581080(self):
598 iter = re.finditer(r"\s", "a b")
Georg Brandla18af4e2007-04-21 15:47:16 +0000599 self.assertEqual(next(iter).span(), (1,2))
600 self.assertRaises(StopIteration, next, iter)
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000601
602 scanner = re.compile(r"\s").scanner("a b")
603 self.assertEqual(scanner.search().span(), (1, 2))
604 self.assertEqual(scanner.search(), None)
605
606 def test_bug_817234(self):
607 iter = re.finditer(r".*", "asdf")
Georg Brandla18af4e2007-04-21 15:47:16 +0000608 self.assertEqual(next(iter).span(), (0, 4))
609 self.assertEqual(next(iter).span(), (4, 4))
610 self.assertRaises(StopIteration, next, iter)
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000611
Guido van Rossumd8faa362007-04-27 19:54:29 +0000612 def test_empty_array(self):
613 # SF buf 1647541
614 import array
Guido van Rossum166746c2007-07-03 15:39:16 +0000615 for typecode in 'bBuhHiIlLfd':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000616 a = array.array(typecode)
617 self.assertEqual(re.compile("bla").match(a), None)
618 self.assertEqual(re.compile("").match(a).groups(), ())
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000619
Christian Heimes072c0f12008-01-03 23:01:04 +0000620 def test_inline_flags(self):
621 # Bug #1700
Christian Heimes2e1d0f02008-01-04 00:47:51 +0000622 upper_char = chr(0x1ea0) # Latin Capital Letter A with Dot Bellow
623 lower_char = chr(0x1ea1) # Latin Small Letter A with Dot Bellow
Christian Heimes072c0f12008-01-03 23:01:04 +0000624
625 p = re.compile(upper_char, re.I | re.U)
626 q = p.match(lower_char)
627 self.assertNotEqual(q, None)
628
629 p = re.compile(lower_char, re.I | re.U)
630 q = p.match(upper_char)
631 self.assertNotEqual(q, None)
632
633 p = re.compile('(?i)' + upper_char, re.U)
634 q = p.match(lower_char)
635 self.assertNotEqual(q, None)
636
637 p = re.compile('(?i)' + lower_char, re.U)
638 q = p.match(upper_char)
639 self.assertNotEqual(q, None)
640
641 p = re.compile('(?iu)' + upper_char)
642 q = p.match(lower_char)
643 self.assertNotEqual(q, None)
644
645 p = re.compile('(?iu)' + lower_char)
646 q = p.match(upper_char)
647 self.assertNotEqual(q, None)
648
Christian Heimes25bb7832008-01-11 16:17:00 +0000649 def test_dollar_matches_twice(self):
650 "$ matches the end of string, and just before the terminating \n"
651 pattern = re.compile('$')
652 self.assertEqual(pattern.sub('#', 'a\nb\n'), 'a\nb#\n#')
653 self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a\nb\nc#')
654 self.assertEqual(pattern.sub('#', '\n'), '#\n#')
655
656 pattern = re.compile('$', re.MULTILINE)
657 self.assertEqual(pattern.sub('#', 'a\nb\n' ), 'a#\nb#\n#' )
658 self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a#\nb#\nc#')
659 self.assertEqual(pattern.sub('#', '\n'), '#\n#')
660
Christian Heimes072c0f12008-01-03 23:01:04 +0000661
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000662def run_re_tests():
663 from test.re_tests import benchmarks, tests, SUCCEED, FAIL, SYNTAX_ERROR
664 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000665 print('Running re_tests test suite')
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000666 else:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000667 # To save time, only run the first and last 10 tests
668 #tests = tests[:10] + tests[-10:]
669 pass
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000670
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000671 for t in tests:
672 sys.stdout.flush()
673 pattern = s = outcome = repl = expected = None
674 if len(t) == 5:
675 pattern, s, outcome, repl, expected = t
676 elif len(t) == 3:
677 pattern, s, outcome = t
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000678 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000679 raise ValueError('Test tuples should have 3 or 5 fields', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000680
Guido van Rossum41360a41998-03-26 19:42:58 +0000681 try:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000682 obj = re.compile(pattern)
683 except re.error:
684 if outcome == SYNTAX_ERROR: pass # Expected a syntax error
Guido van Rossum41360a41998-03-26 19:42:58 +0000685 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000686 print('=== Syntax error:', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000687 except KeyboardInterrupt: raise KeyboardInterrupt
688 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000689 print('*** Unexpected error ***', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000690 if verbose:
691 traceback.print_exc(file=sys.stdout)
692 else:
Fredrik Lundh17741be2001-03-22 15:51:28 +0000693 try:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000694 result = obj.search(s)
Guido van Rossumb940e112007-01-10 16:19:56 +0000695 except re.error as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000696 print('=== Unexpected exception', t, repr(msg))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000697 if outcome == SYNTAX_ERROR:
698 # This should have been a syntax error; forget it.
699 pass
700 elif outcome == FAIL:
701 if result is None: pass # No match, as expected
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000702 else: print('=== Succeeded incorrectly', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000703 elif outcome == SUCCEED:
704 if result is not None:
705 # Matched, as expected, so now we compute the
706 # result string and compare it to our expected result.
707 start, end = result.span(0)
708 vardict={'found': result.group(0),
709 'groups': result.group(),
710 'flags': result.re.flags}
711 for i in range(1, 100):
712 try:
713 gi = result.group(i)
714 # Special hack because else the string concat fails:
715 if gi is None:
716 gi = "None"
717 except IndexError:
718 gi = "Error"
719 vardict['g%d' % i] = gi
720 for i in result.re.groupindex.keys():
721 try:
722 gi = result.group(i)
723 if gi is None:
724 gi = "None"
725 except IndexError:
726 gi = "Error"
727 vardict[i] = gi
728 repl = eval(repl, vardict)
729 if repl != expected:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000730 print('=== grouping error', t, end=' ')
731 print(repr(repl) + ' should be ' + repr(expected))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000732 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000733 print('=== Failed incorrectly', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000734
Antoine Pitrou22628c42008-07-22 17:53:22 +0000735 # Try the match with both pattern and string converted to
736 # bytes, and check that it still succeeds.
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000737 try:
Antoine Pitrou22628c42008-07-22 17:53:22 +0000738 bpat = bytes(pattern, "ascii")
739 bs = bytes(s, "ascii")
740 except UnicodeEncodeError:
741 # skip non-ascii tests
742 pass
743 else:
744 try:
745 bpat = re.compile(bpat)
746 except Exception:
747 print('=== Fails on bytes pattern compile', t)
748 if verbose:
749 traceback.print_exc(file=sys.stdout)
750 else:
751 bytes_result = bpat.search(bs)
752 if bytes_result is None:
753 print('=== Fails on bytes pattern match', t)
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000754
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000755 # Try the match with the search area limited to the extent
756 # of the match and see if it still succeeds. \B will
757 # break (because it won't match at the end or start of a
758 # string), so we'll ignore patterns that feature it.
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000759
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000760 if pattern[:2] != '\\B' and pattern[-2:] != '\\B' \
761 and result is not None:
762 obj = re.compile(pattern)
763 result = obj.search(s, result.start(0), result.end(0) + 1)
764 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000765 print('=== Failed on range-limited match', t)
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000766
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000767 # Try the match with IGNORECASE enabled, and check that it
768 # still succeeds.
769 obj = re.compile(pattern, re.IGNORECASE)
770 result = obj.search(s)
Fred Drake132dce22000-12-12 23:11:42 +0000771 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000772 print('=== Fails on case-insensitive match', t)
Guido van Rossumdfa67901997-12-08 17:12:06 +0000773
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000774 # Try the match with LOCALE enabled, and check that it
775 # still succeeds.
Antoine Pitrou22628c42008-07-22 17:53:22 +0000776 if '(?u)' not in pattern:
777 obj = re.compile(pattern, re.LOCALE)
778 result = obj.search(s)
779 if result is None:
780 print('=== Fails on locale-sensitive match', t)
Guido van Rossumdfa67901997-12-08 17:12:06 +0000781
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000782 # Try the match with UNICODE locale enabled, and check
783 # that it still succeeds.
784 obj = re.compile(pattern, re.UNICODE)
785 result = obj.search(s)
786 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000787 print('=== Fails on unicode-sensitive match', t)
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000788
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000789def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000790 run_unittest(ReTests)
Skip Montanaro1e703c62003-04-25 15:40:28 +0000791 run_re_tests()
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000792
793if __name__ == "__main__":
794 test_main()