blob: b6dfea8155dead0165f062a9e547e4dcc08a386a [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
Guido van Rossumd8faa362007-04-27 19:54:29 +00004from test.test_support import verbose, run_unittest, guard_warnings_filter
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
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +000086 def test_sub_template_numeric_escape(self):
87 # bug 776311 and friends
88 self.assertEqual(re.sub('x', r'\0', 'x'), '\0')
89 self.assertEqual(re.sub('x', r'\000', 'x'), '\000')
90 self.assertEqual(re.sub('x', r'\001', 'x'), '\001')
91 self.assertEqual(re.sub('x', r'\008', 'x'), '\0' + '8')
92 self.assertEqual(re.sub('x', r'\009', 'x'), '\0' + '9')
93 self.assertEqual(re.sub('x', r'\111', 'x'), '\111')
94 self.assertEqual(re.sub('x', r'\117', 'x'), '\117')
95
96 self.assertEqual(re.sub('x', r'\1111', 'x'), '\1111')
97 self.assertEqual(re.sub('x', r'\1111', 'x'), '\111' + '1')
98
99 self.assertEqual(re.sub('x', r'\00', 'x'), '\x00')
100 self.assertEqual(re.sub('x', r'\07', 'x'), '\x07')
101 self.assertEqual(re.sub('x', r'\08', 'x'), '\0' + '8')
102 self.assertEqual(re.sub('x', r'\09', 'x'), '\0' + '9')
103 self.assertEqual(re.sub('x', r'\0a', 'x'), '\0' + 'a')
104
105 self.assertEqual(re.sub('x', r'\400', 'x'), '\0')
106 self.assertEqual(re.sub('x', r'\777', 'x'), '\377')
Tim Peters0e9980f2004-09-12 03:49:31 +0000107
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000108 self.assertRaises(re.error, re.sub, 'x', r'\1', 'x')
109 self.assertRaises(re.error, re.sub, 'x', r'\8', 'x')
110 self.assertRaises(re.error, re.sub, 'x', r'\9', 'x')
111 self.assertRaises(re.error, re.sub, 'x', r'\11', 'x')
112 self.assertRaises(re.error, re.sub, 'x', r'\18', 'x')
113 self.assertRaises(re.error, re.sub, 'x', r'\1a', 'x')
114 self.assertRaises(re.error, re.sub, 'x', r'\90', 'x')
115 self.assertRaises(re.error, re.sub, 'x', r'\99', 'x')
116 self.assertRaises(re.error, re.sub, 'x', r'\118', 'x') # r'\11' + '8'
117 self.assertRaises(re.error, re.sub, 'x', r'\11a', 'x')
118 self.assertRaises(re.error, re.sub, 'x', r'\181', 'x') # r'\18' + '1'
119 self.assertRaises(re.error, re.sub, 'x', r'\800', 'x') # r'\80' + '0'
120
121 # in python2.3 (etc), these loop endlessly in sre_parser.py
122 self.assertEqual(re.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x')
123 self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\118', 'xyz'),
124 'xz8')
125 self.assertEqual(re.sub('((((((((((y))))))))))(.)', r'\11a', 'xyz'),
126 'xza')
127
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000128 def test_qualified_re_sub(self):
129 self.assertEqual(re.sub('a', 'b', 'aaaaa'), 'bbbbb')
130 self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa')
Guido van Rossum8430c581998-04-03 21:47:12 +0000131
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000132 def test_bug_114660(self):
133 self.assertEqual(re.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'),
134 'hello there')
135
136 def test_bug_462270(self):
137 # Test for empty sub() behaviour, see SF bug #462270
138 self.assertEqual(re.sub('x*', '-', 'abxd'), '-a-b-d-')
139 self.assertEqual(re.sub('x+', '-', 'abxd'), 'ab-d')
140
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000141 def test_symbolic_refs(self):
142 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a', 'xx')
143 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<', 'xx')
144 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g', 'xx')
145 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a a>', 'xx')
146 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<1a1>', 'xx')
147 self.assertRaises(IndexError, re.sub, '(?P<a>x)', '\g<ab>', 'xx')
148 self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')
149 self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\\2', 'xx')
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000150 self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<-1>', 'xx')
Guido van Rossumf473cb01998-01-14 16:42:17 +0000151
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000152 def test_re_subn(self):
153 self.assertEqual(re.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2))
154 self.assertEqual(re.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1))
155 self.assertEqual(re.subn("b+", "x", "xyz"), ('xyz', 0))
156 self.assertEqual(re.subn("b*", "x", "xyz"), ('xxxyxzx', 4))
157 self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2))
Guido van Rossum49946571997-07-18 04:26:25 +0000158
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000159 def test_re_split(self):
160 self.assertEqual(re.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c'])
161 self.assertEqual(re.split(":*", ":a:b::c"), ['', 'a', 'b', 'c'])
162 self.assertEqual(re.split("(:*)", ":a:b::c"),
163 ['', ':', 'a', ':', 'b', '::', 'c'])
164 self.assertEqual(re.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c'])
165 self.assertEqual(re.split("(:)*", ":a:b::c"),
166 ['', ':', 'a', ':', 'b', ':', 'c'])
167 self.assertEqual(re.split("([b:]+)", ":a:b::c"),
168 ['', ':', 'a', ':b::', 'c'])
169 self.assertEqual(re.split("(b)|(:+)", ":a:b::c"),
170 ['', None, ':', 'a', None, ':', '', 'b', None, '',
171 None, '::', 'c'])
172 self.assertEqual(re.split("(?:b)|(?::+)", ":a:b::c"),
173 ['', 'a', '', '', 'c'])
Guido van Rossum49946571997-07-18 04:26:25 +0000174
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000175 def test_qualified_re_split(self):
176 self.assertEqual(re.split(":", ":a:b::c", 2), ['', 'a', 'b::c'])
177 self.assertEqual(re.split(':', 'a:b:c:d', 2), ['a', 'b', 'c:d'])
178 self.assertEqual(re.split("(:)", ":a:b::c", 2),
179 ['', ':', 'a', ':', 'b::c'])
180 self.assertEqual(re.split("(:*)", ":a:b::c", 2),
181 ['', ':', 'a', ':', 'b::c'])
Guido van Rossum49946571997-07-18 04:26:25 +0000182
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000183 def test_re_findall(self):
184 self.assertEqual(re.findall(":+", "abc"), [])
185 self.assertEqual(re.findall(":+", "a:b::c:::d"), [":", "::", ":::"])
186 self.assertEqual(re.findall("(:+)", "a:b::c:::d"), [":", "::", ":::"])
187 self.assertEqual(re.findall("(:)(:*)", "a:b::c:::d"), [(":", ""),
188 (":", ":"),
189 (":", "::")])
Guido van Rossum49946571997-07-18 04:26:25 +0000190
Skip Montanaro5ba00542003-04-25 16:00:14 +0000191 def test_bug_117612(self):
192 self.assertEqual(re.findall(r"(a|(b))", "aba"),
193 [("a", ""),("b", "b"),("a", "")])
194
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000195 def test_re_match(self):
Skip Montanaro5ba00542003-04-25 16:00:14 +0000196 self.assertEqual(re.match('a', 'a').groups(), ())
197 self.assertEqual(re.match('(a)', 'a').groups(), ('a',))
198 self.assertEqual(re.match(r'(a)', 'a').group(0), 'a')
199 self.assertEqual(re.match(r'(a)', 'a').group(1), 'a')
200 self.assertEqual(re.match(r'(a)', 'a').group(1, 1), ('a', 'a'))
Guido van Rossum49946571997-07-18 04:26:25 +0000201
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000202 pat = re.compile('((a)|(b))(c)?')
203 self.assertEqual(pat.match('a').groups(), ('a', 'a', None, None))
204 self.assertEqual(pat.match('b').groups(), ('b', None, 'b', None))
205 self.assertEqual(pat.match('ac').groups(), ('a', 'a', None, 'c'))
206 self.assertEqual(pat.match('bc').groups(), ('b', None, 'b', 'c'))
207 self.assertEqual(pat.match('bc').groups(""), ('b', "", 'b', 'c'))
Guido van Rossum8430c581998-04-03 21:47:12 +0000208
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000209 # A single group
210 m = re.match('(a)', 'a')
211 self.assertEqual(m.group(0), 'a')
212 self.assertEqual(m.group(0), 'a')
213 self.assertEqual(m.group(1), 'a')
214 self.assertEqual(m.group(1, 1), ('a', 'a'))
Guido van Rossum49946571997-07-18 04:26:25 +0000215
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000216 pat = re.compile('(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?')
217 self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None))
218 self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'),
219 (None, 'b', None))
220 self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c'))
Guido van Rossum49946571997-07-18 04:26:25 +0000221
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000222 def test_re_groupref_exists(self):
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000223 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a)').groups(),
224 ('(', 'a'))
225 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a').groups(),
226 (None, 'a'))
227 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', 'a)'), None)
228 self.assertEqual(re.match('^(\()?([^()]+)(?(1)\))$', '(a'), None)
229 self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'ab').groups(),
230 ('a', 'b'))
231 self.assertEqual(re.match('^(?:(a)|c)((?(1)b|d))$', 'cd').groups(),
232 (None, 'd'))
233 self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'cd').groups(),
234 (None, 'd'))
235 self.assertEqual(re.match('^(?:(a)|c)((?(1)|d))$', 'a').groups(),
236 ('a', ''))
237
Michael W. Hudsone7fa1af2005-06-03 13:55:58 +0000238 # Tests for bug #1177831: exercise groups other than the first group
239 p = re.compile('(?P<g1>a)(?P<g2>b)?((?(g2)c|d))')
240 self.assertEqual(p.match('abc').groups(),
241 ('a', 'b', 'c'))
242 self.assertEqual(p.match('ad').groups(),
243 ('a', None, 'd'))
244 self.assertEqual(p.match('abd'), None)
245 self.assertEqual(p.match('ac'), None)
246
Andrew M. Kuchling3554cad2005-06-02 13:38:45 +0000247
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000248 def test_re_groupref(self):
249 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a|').groups(),
250 ('|', 'a'))
251 self.assertEqual(re.match(r'^(\|)?([^()]+)\1?$', 'a').groups(),
252 (None, 'a'))
253 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', 'a|'), None)
254 self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a'), None)
255 self.assertEqual(re.match(r'^(?:(a)|c)(\1)$', 'aa').groups(),
256 ('a', 'a'))
257 self.assertEqual(re.match(r'^(?:(a)|c)(\1)?$', 'c').groups(),
258 (None, None))
259
260 def test_groupdict(self):
261 self.assertEqual(re.match('(?P<first>first) (?P<second>second)',
262 'first second').groupdict(),
263 {'first':'first', 'second':'second'})
264
265 def test_expand(self):
266 self.assertEqual(re.match("(?P<first>first) (?P<second>second)",
267 "first second")
268 .expand(r"\2 \1 \g<second> \g<first>"),
269 "second first second first")
270
271 def test_repeat_minmax(self):
272 self.assertEqual(re.match("^(\w){1}$", "abc"), None)
273 self.assertEqual(re.match("^(\w){1}?$", "abc"), None)
274 self.assertEqual(re.match("^(\w){1,2}$", "abc"), None)
275 self.assertEqual(re.match("^(\w){1,2}?$", "abc"), None)
276
277 self.assertEqual(re.match("^(\w){3}$", "abc").group(1), "c")
278 self.assertEqual(re.match("^(\w){1,3}$", "abc").group(1), "c")
279 self.assertEqual(re.match("^(\w){1,4}$", "abc").group(1), "c")
280 self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
281 self.assertEqual(re.match("^(\w){3}?$", "abc").group(1), "c")
282 self.assertEqual(re.match("^(\w){1,3}?$", "abc").group(1), "c")
283 self.assertEqual(re.match("^(\w){1,4}?$", "abc").group(1), "c")
284 self.assertEqual(re.match("^(\w){3,4}?$", "abc").group(1), "c")
285
286 self.assertEqual(re.match("^x{1}$", "xxx"), None)
287 self.assertEqual(re.match("^x{1}?$", "xxx"), None)
288 self.assertEqual(re.match("^x{1,2}$", "xxx"), None)
289 self.assertEqual(re.match("^x{1,2}?$", "xxx"), None)
290
291 self.assertNotEqual(re.match("^x{3}$", "xxx"), None)
292 self.assertNotEqual(re.match("^x{1,3}$", "xxx"), None)
293 self.assertNotEqual(re.match("^x{1,4}$", "xxx"), None)
294 self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
295 self.assertNotEqual(re.match("^x{3}?$", "xxx"), None)
296 self.assertNotEqual(re.match("^x{1,3}?$", "xxx"), None)
297 self.assertNotEqual(re.match("^x{1,4}?$", "xxx"), None)
298 self.assertNotEqual(re.match("^x{3,4}?$", "xxx"), None)
299
Gustavo Niemeyer6fa0c5a2005-09-14 08:54:39 +0000300 self.assertEqual(re.match("^x{}$", "xxx"), None)
301 self.assertNotEqual(re.match("^x{}$", "x{}"), None)
302
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000303 def test_getattr(self):
304 self.assertEqual(re.match("(a)", "a").pos, 0)
305 self.assertEqual(re.match("(a)", "a").endpos, 1)
306 self.assertEqual(re.match("(a)", "a").string, "a")
307 self.assertEqual(re.match("(a)", "a").regs, ((0, 1), (0, 1)))
308 self.assertNotEqual(re.match("(a)", "a").re, None)
309
310 def test_special_escapes(self):
311 self.assertEqual(re.search(r"\b(b.)\b",
312 "abcd abc bcd bx").group(1), "bx")
313 self.assertEqual(re.search(r"\B(b.)\B",
314 "abc bcd bc abxd").group(1), "bx")
315 self.assertEqual(re.search(r"\b(b.)\b",
316 "abcd abc bcd bx", re.LOCALE).group(1), "bx")
317 self.assertEqual(re.search(r"\B(b.)\B",
318 "abc bcd bc abxd", re.LOCALE).group(1), "bx")
319 self.assertEqual(re.search(r"\b(b.)\b",
320 "abcd abc bcd bx", re.UNICODE).group(1), "bx")
321 self.assertEqual(re.search(r"\B(b.)\B",
322 "abc bcd bc abxd", re.UNICODE).group(1), "bx")
323 self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
324 self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
325 self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
326 self.assertEqual(re.search(r"\b(b.)\b",
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000327 "abcd abc bcd bx").group(1), "bx")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000328 self.assertEqual(re.search(r"\B(b.)\B",
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000329 "abc bcd bc abxd").group(1), "bx")
330 self.assertEqual(re.search(r"^abc$", "\nabc\n", re.M).group(0), "abc")
331 self.assertEqual(re.search(r"^\Aabc\Z$", "abc", re.M).group(0), "abc")
332 self.assertEqual(re.search(r"^\Aabc\Z$", "\nabc\n", re.M), None)
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000333 self.assertEqual(re.search(r"\d\D\w\W\s\S",
334 "1aa! a").group(0), "1aa! a")
335 self.assertEqual(re.search(r"\d\D\w\W\s\S",
336 "1aa! a", re.LOCALE).group(0), "1aa! a")
337 self.assertEqual(re.search(r"\d\D\w\W\s\S",
338 "1aa! a", re.UNICODE).group(0), "1aa! a")
339
340 def test_ignore_case(self):
341 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000342 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000343
344 def test_bigcharset(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000345 self.assertEqual(re.match("([\u2222\u2223])",
346 "\u2222").group(1), "\u2222")
347 self.assertEqual(re.match("([\u2222\u2223])",
348 "\u2222", re.UNICODE).group(1), "\u2222")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000349
350 def test_anyall(self):
351 self.assertEqual(re.match("a.b", "a\nb", re.DOTALL).group(0),
352 "a\nb")
353 self.assertEqual(re.match("a.*b", "a\n\nb", re.DOTALL).group(0),
354 "a\n\nb")
355
356 def test_non_consuming(self):
357 self.assertEqual(re.match("(a(?=\s[^a]))", "a b").group(1), "a")
358 self.assertEqual(re.match("(a(?=\s[^a]*))", "a b").group(1), "a")
359 self.assertEqual(re.match("(a(?=\s[abc]))", "a b").group(1), "a")
360 self.assertEqual(re.match("(a(?=\s[abc]*))", "a bc").group(1), "a")
361 self.assertEqual(re.match(r"(a)(?=\s\1)", "a a").group(1), "a")
362 self.assertEqual(re.match(r"(a)(?=\s\1*)", "a aa").group(1), "a")
363 self.assertEqual(re.match(r"(a)(?=\s(abc|a))", "a a").group(1), "a")
364
365 self.assertEqual(re.match(r"(a(?!\s[^a]))", "a a").group(1), "a")
366 self.assertEqual(re.match(r"(a(?!\s[abc]))", "a d").group(1), "a")
367 self.assertEqual(re.match(r"(a)(?!\s\1)", "a b").group(1), "a")
368 self.assertEqual(re.match(r"(a)(?!\s(abc|a))", "a b").group(1), "a")
369
370 def test_ignore_case(self):
371 self.assertEqual(re.match(r"(a\s[^a])", "a b", re.I).group(1), "a b")
372 self.assertEqual(re.match(r"(a\s[^a]*)", "a bb", re.I).group(1), "a bb")
373 self.assertEqual(re.match(r"(a\s[abc])", "a b", re.I).group(1), "a b")
374 self.assertEqual(re.match(r"(a\s[abc]*)", "a bb", re.I).group(1), "a bb")
375 self.assertEqual(re.match(r"((a)\s\2)", "a a", re.I).group(1), "a a")
376 self.assertEqual(re.match(r"((a)\s\2*)", "a aa", re.I).group(1), "a aa")
377 self.assertEqual(re.match(r"((a)\s(abc|a))", "a a", re.I).group(1), "a a")
378 self.assertEqual(re.match(r"((a)\s(abc|a)*)", "a aa", re.I).group(1), "a aa")
379
380 def test_category(self):
381 self.assertEqual(re.match(r"(\s)", " ").group(1), " ")
382
383 def test_getlower(self):
384 import _sre
385 self.assertEqual(_sre.getlower(ord('A'), 0), ord('a'))
386 self.assertEqual(_sre.getlower(ord('A'), re.LOCALE), ord('a'))
387 self.assertEqual(_sre.getlower(ord('A'), re.UNICODE), ord('a'))
388
389 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000390 self.assertEqual(re.match("abc", "ABC", re.I).group(0), "ABC")
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000391
392 def test_not_literal(self):
393 self.assertEqual(re.search("\s([^a])", " b").group(1), "b")
394 self.assertEqual(re.search("\s([^a]*)", " bb").group(1), "bb")
395
396 def test_search_coverage(self):
397 self.assertEqual(re.search("\s(b)", " b").group(1), "b")
398 self.assertEqual(re.search("a\s", "a ").group(0), "a ")
399
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000400 def test_re_escape(self):
401 p=""
402 for i in range(0, 256):
403 p = p + chr(i)
404 self.assertEqual(re.match(re.escape(chr(i)), chr(i)) is not None,
405 True)
406 self.assertEqual(re.match(re.escape(chr(i)), chr(i)).span(), (0,1))
Guido van Rossum49946571997-07-18 04:26:25 +0000407
Skip Montanaro1e703c62003-04-25 15:40:28 +0000408 pat=re.compile(re.escape(p))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000409 self.assertEqual(pat.match(p) is not None, True)
410 self.assertEqual(pat.match(p).span(), (0,256))
Guido van Rossum49946571997-07-18 04:26:25 +0000411
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000412 def test_pickling(self):
413 import pickle
Skip Montanaro1e703c62003-04-25 15:40:28 +0000414 self.pickle_test(pickle)
Guido van Rossumbf12cdb2006-08-17 20:24:18 +0000415 try:
416 import cPickle
417 except ImportError:
418 pass # cPickle not found -- skip it
419 else:
420 self.pickle_test(cPickle)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000421 # old pickles expect the _compile() reconstructor in sre module
422 import warnings
423 with guard_warnings_filter():
424 warnings.filterwarnings("ignore", "The sre module is deprecated",
425 DeprecationWarning)
426 from sre import _compile
Skip Montanaro1e703c62003-04-25 15:40:28 +0000427
428 def pickle_test(self, pickle):
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000429 oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')
430 s = pickle.dumps(oldpat)
431 newpat = pickle.loads(s)
432 self.assertEqual(oldpat, newpat)
Guido van Rossum23b22571997-07-17 22:36:14 +0000433
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000434 def test_constants(self):
435 self.assertEqual(re.I, re.IGNORECASE)
436 self.assertEqual(re.L, re.LOCALE)
437 self.assertEqual(re.M, re.MULTILINE)
438 self.assertEqual(re.S, re.DOTALL)
439 self.assertEqual(re.X, re.VERBOSE)
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000440
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000441 def test_flags(self):
Skip Montanaro1e703c62003-04-25 15:40:28 +0000442 for flag in [re.I, re.M, re.X, re.S, re.L]:
443 self.assertNotEqual(re.compile('^pattern$', flag), None)
Guido van Rossumf473cb01998-01-14 16:42:17 +0000444
Skip Montanaro7d9963f2003-04-25 14:12:40 +0000445 def test_sre_character_literals(self):
446 for i in [0, 8, 16, 32, 64, 127, 128, 255]:
447 self.assertNotEqual(re.match(r"\%03o" % i, chr(i)), None)
448 self.assertNotEqual(re.match(r"\%03o0" % i, chr(i)+"0"), None)
449 self.assertNotEqual(re.match(r"\%03o8" % i, chr(i)+"8"), None)
450 self.assertNotEqual(re.match(r"\x%02x" % i, chr(i)), None)
451 self.assertNotEqual(re.match(r"\x%02x0" % i, chr(i)+"0"), None)
452 self.assertNotEqual(re.match(r"\x%02xz" % i, chr(i)+"z"), None)
453 self.assertRaises(re.error, re.match, "\911", "")
454
Gustavo Niemeyera01a2ee2004-09-03 17:06:10 +0000455 def test_sre_character_class_literals(self):
456 for i in [0, 8, 16, 32, 64, 127, 128, 255]:
457 self.assertNotEqual(re.match(r"[\%03o]" % i, chr(i)), None)
458 self.assertNotEqual(re.match(r"[\%03o0]" % i, chr(i)), None)
459 self.assertNotEqual(re.match(r"[\%03o8]" % i, chr(i)), None)
460 self.assertNotEqual(re.match(r"[\x%02x]" % i, chr(i)), None)
461 self.assertNotEqual(re.match(r"[\x%02x0]" % i, chr(i)), None)
462 self.assertNotEqual(re.match(r"[\x%02xz]" % i, chr(i)), None)
463 self.assertRaises(re.error, re.match, "[\911]", "")
464
Skip Montanaro7d9963f2003-04-25 14:12:40 +0000465 def test_bug_113254(self):
466 self.assertEqual(re.match(r'(a)|(b)', 'b').start(1), -1)
467 self.assertEqual(re.match(r'(a)|(b)', 'b').end(1), -1)
468 self.assertEqual(re.match(r'(a)|(b)', 'b').span(1), (-1, -1))
469
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000470 def test_bug_527371(self):
471 # bug described in patches 527371/672491
472 self.assertEqual(re.match(r'(a)?a','a').lastindex, None)
473 self.assertEqual(re.match(r'(a)(b)?b','ab').lastindex, 1)
474 self.assertEqual(re.match(r'(?P<a>a)(?P<b>b)?b','ab').lastgroup, 'a')
475 self.assertEqual(re.match("(?P<a>a(b))", "ab").lastgroup, 'a')
476 self.assertEqual(re.match("((a))", "a").lastindex, 1)
477
478 def test_bug_545855(self):
479 # bug 545855 -- This pattern failed to cause a compile error as it
480 # should, instead provoking a TypeError.
481 self.assertRaises(re.error, re.compile, 'foo[a-')
482
483 def test_bug_418626(self):
484 # bugs 418626 at al. -- Testing Greg Chapman's addition of op code
485 # SRE_OP_MIN_REPEAT_ONE for eliminating recursion on simple uses of
486 # pattern '*?' on a long string.
487 self.assertEqual(re.match('.*?c', 10000*'ab'+'cd').end(0), 20001)
488 self.assertEqual(re.match('.*?cd', 5000*'ab'+'c'+5000*'ab'+'cde').end(0),
489 20003)
490 self.assertEqual(re.match('.*?cd', 20000*'abc'+'de').end(0), 60001)
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000491 # non-simple '*?' still used to hit the recursion limit, before the
Tim Peters58eb11c2004-01-18 20:29:55 +0000492 # non-recursive scheme was implemented.
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000493 self.assertEqual(re.search('(a|b)*?c', 10000*'ab'+'cd').end(0), 20001)
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000494
495 def test_bug_612074(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000496 pat="["+re.escape("\u2039")+"]"
Skip Montanaro2726fcd2003-04-25 14:31:54 +0000497 self.assertEqual(re.compile(pat) and 1, 1)
498
Skip Montanaro1e703c62003-04-25 15:40:28 +0000499 def test_stack_overflow(self):
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000500 # nasty cases that used to overflow the straightforward recursive
Skip Montanaro1e703c62003-04-25 15:40:28 +0000501 # implementation of repeated groups.
Gustavo Niemeyerad3fc442003-10-17 22:13:16 +0000502 self.assertEqual(re.match('(x)*', 50000*'x').group(1), 'x')
503 self.assertEqual(re.match('(x)*y', 50000*'x'+'y').group(1), 'x')
504 self.assertEqual(re.match('(x)*?y', 50000*'x'+'y').group(1), 'x')
Skip Montanaro1e703c62003-04-25 15:40:28 +0000505
506 def test_scanner(self):
507 def s_ident(scanner, token): return token
508 def s_operator(scanner, token): return "op%s" % token
509 def s_float(scanner, token): return float(token)
510 def s_int(scanner, token): return int(token)
511
512 scanner = Scanner([
513 (r"[a-zA-Z_]\w*", s_ident),
514 (r"\d+\.\d*", s_float),
515 (r"\d+", s_int),
516 (r"=|\+|-|\*|/", s_operator),
517 (r"\s+", None),
518 ])
519
Gustavo Niemeyer25fe0bf2003-06-20 00:25:14 +0000520 self.assertNotEqual(scanner.scanner.scanner("").pattern, None)
521
Skip Montanaro1e703c62003-04-25 15:40:28 +0000522 self.assertEqual(scanner.scan("sum = 3*foo + 312.50 + bar"),
523 (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5,
524 'op+', 'bar'], ''))
525
Skip Montanaro5ba00542003-04-25 16:00:14 +0000526 def test_bug_448951(self):
527 # bug 448951 (similar to 429357, but with single char match)
528 # (Also test greedy matches.)
529 for op in '','?','*':
530 self.assertEqual(re.match(r'((.%s):)?z'%op, 'z').groups(),
531 (None, None))
532 self.assertEqual(re.match(r'((.%s):)?z'%op, 'a:z').groups(),
533 ('a:', 'a'))
534
Gustavo Niemeyerc34f2552003-04-27 12:34:14 +0000535 def test_bug_725106(self):
536 # capturing groups in alternatives in repeats
537 self.assertEqual(re.match('^((a)|b)*', 'abc').groups(),
538 ('b', 'a'))
539 self.assertEqual(re.match('^(([ab])|c)*', 'abc').groups(),
540 ('c', 'b'))
541 self.assertEqual(re.match('^((d)|[ab])*', 'abc').groups(),
542 ('b', None))
543 self.assertEqual(re.match('^((a)c|[ab])*', 'abc').groups(),
544 ('b', None))
545 self.assertEqual(re.match('^((a)|b)*?c', 'abc').groups(),
546 ('b', 'a'))
547 self.assertEqual(re.match('^(([ab])|c)*?d', 'abcd').groups(),
548 ('c', 'b'))
549 self.assertEqual(re.match('^((d)|[ab])*?c', 'abc').groups(),
550 ('b', None))
551 self.assertEqual(re.match('^((a)c|[ab])*?c', 'abc').groups(),
552 ('b', None))
553
Gustavo Niemeyer3646ab92003-04-27 13:25:21 +0000554 def test_bug_725149(self):
555 # mark_stack_base restoring before restoring marks
556 self.assertEqual(re.match('(a)(?:(?=(b)*)c)*', 'abb').groups(),
557 ('a', None))
558 self.assertEqual(re.match('(a)((?!(b)*))*', 'abb').groups(),
559 ('a', None, None))
560
Just van Rossum12723ba2003-07-02 20:03:04 +0000561 def test_bug_764548(self):
562 # bug 764548, re.compile() barfs on str/unicode subclasses
563 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000564 str
Just van Rossum12723ba2003-07-02 20:03:04 +0000565 except NameError:
566 return # no problem if we have no unicode
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000567 class my_unicode(str): pass
Just van Rossum12723ba2003-07-02 20:03:04 +0000568 pat = re.compile(my_unicode("abc"))
569 self.assertEqual(pat.match("xyz"), None)
570
Skip Montanaro5ba00542003-04-25 16:00:14 +0000571 def test_finditer(self):
572 iter = re.finditer(r":+", "a:b::c:::d")
573 self.assertEqual([item.group(0) for item in iter],
574 [":", "::", ":::"])
575
Hye-Shik Chang9f62ecc2004-04-20 21:30:07 +0000576 def test_bug_926075(self):
577 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000578 str
Hye-Shik Chang9f62ecc2004-04-20 21:30:07 +0000579 except NameError:
580 return # no problem if we have no unicode
581 self.assert_(re.compile('bug_926075') is not
582 re.compile(eval("u'bug_926075'")))
583
Martin v. Löwis7d9c6c72004-05-07 07:18:13 +0000584 def test_bug_931848(self):
585 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000586 str
Martin v. Löwis7d9c6c72004-05-07 07:18:13 +0000587 except NameError:
588 pass
589 pattern = eval('u"[\u002E\u3002\uFF0E\uFF61]"')
590 self.assertEqual(re.compile(pattern).split("a.b.c"),
591 ['a','b','c'])
592
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000593 def test_bug_581080(self):
594 iter = re.finditer(r"\s", "a b")
Georg Brandla18af4e2007-04-21 15:47:16 +0000595 self.assertEqual(next(iter).span(), (1,2))
596 self.assertRaises(StopIteration, next, iter)
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000597
598 scanner = re.compile(r"\s").scanner("a b")
599 self.assertEqual(scanner.search().span(), (1, 2))
600 self.assertEqual(scanner.search(), None)
601
602 def test_bug_817234(self):
603 iter = re.finditer(r".*", "asdf")
Georg Brandla18af4e2007-04-21 15:47:16 +0000604 self.assertEqual(next(iter).span(), (0, 4))
605 self.assertEqual(next(iter).span(), (4, 4))
606 self.assertRaises(StopIteration, next, iter)
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000607
Guido van Rossumd8faa362007-04-27 19:54:29 +0000608 def test_empty_array(self):
609 # SF buf 1647541
610 import array
611 for typecode in 'cbBuhHiIlLfd':
612 a = array.array(typecode)
613 self.assertEqual(re.compile("bla").match(a), None)
614 self.assertEqual(re.compile("").match(a).groups(), ())
Gustavo Niemeyer0506c642004-09-03 18:11:59 +0000615
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000616def run_re_tests():
617 from test.re_tests import benchmarks, tests, SUCCEED, FAIL, SYNTAX_ERROR
618 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000619 print('Running re_tests test suite')
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000620 else:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000621 # To save time, only run the first and last 10 tests
622 #tests = tests[:10] + tests[-10:]
623 pass
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000624
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000625 for t in tests:
626 sys.stdout.flush()
627 pattern = s = outcome = repl = expected = None
628 if len(t) == 5:
629 pattern, s, outcome, repl, expected = t
630 elif len(t) == 3:
631 pattern, s, outcome = t
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000632 else:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000633 raise ValueError, ('Test tuples should have 3 or 5 fields', t)
634
Guido van Rossum41360a41998-03-26 19:42:58 +0000635 try:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000636 obj = re.compile(pattern)
637 except re.error:
638 if outcome == SYNTAX_ERROR: pass # Expected a syntax error
Guido van Rossum41360a41998-03-26 19:42:58 +0000639 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000640 print('=== Syntax error:', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000641 except KeyboardInterrupt: raise KeyboardInterrupt
642 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000643 print('*** Unexpected error ***', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000644 if verbose:
645 traceback.print_exc(file=sys.stdout)
646 else:
Fredrik Lundh17741be2001-03-22 15:51:28 +0000647 try:
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000648 result = obj.search(s)
Guido van Rossumb940e112007-01-10 16:19:56 +0000649 except re.error as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000650 print('=== Unexpected exception', t, repr(msg))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000651 if outcome == SYNTAX_ERROR:
652 # This should have been a syntax error; forget it.
653 pass
654 elif outcome == FAIL:
655 if result is None: pass # No match, as expected
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000656 else: print('=== Succeeded incorrectly', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000657 elif outcome == SUCCEED:
658 if result is not None:
659 # Matched, as expected, so now we compute the
660 # result string and compare it to our expected result.
661 start, end = result.span(0)
662 vardict={'found': result.group(0),
663 'groups': result.group(),
664 'flags': result.re.flags}
665 for i in range(1, 100):
666 try:
667 gi = result.group(i)
668 # Special hack because else the string concat fails:
669 if gi is None:
670 gi = "None"
671 except IndexError:
672 gi = "Error"
673 vardict['g%d' % i] = gi
674 for i in result.re.groupindex.keys():
675 try:
676 gi = result.group(i)
677 if gi is None:
678 gi = "None"
679 except IndexError:
680 gi = "Error"
681 vardict[i] = gi
682 repl = eval(repl, vardict)
683 if repl != expected:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000684 print('=== grouping error', t, end=' ')
685 print(repr(repl) + ' should be ' + repr(expected))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000686 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000687 print('=== Failed incorrectly', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000688
689 # Try the match on a unicode string, and check that it
690 # still succeeds.
691 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000692 result = obj.search(str(s, "latin-1"))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000693 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000694 print('=== Fails on unicode match', t)
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000695 except NameError:
696 continue # 1.5.2
697 except TypeError:
698 continue # unicode test case
699
700 # Try the match on a unicode pattern, and check that it
701 # still succeeds.
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000702 obj=re.compile(str(pattern, "latin-1"))
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000703 result = obj.search(s)
Fredrik Lundh17741be2001-03-22 15:51:28 +0000704 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000705 print('=== Fails on unicode pattern match', t)
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000706
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000707 # Try the match with the search area limited to the extent
708 # of the match and see if it still succeeds. \B will
709 # break (because it won't match at the end or start of a
710 # string), so we'll ignore patterns that feature it.
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000711
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000712 if pattern[:2] != '\\B' and pattern[-2:] != '\\B' \
713 and result is not None:
714 obj = re.compile(pattern)
715 result = obj.search(s, result.start(0), result.end(0) + 1)
716 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000717 print('=== Failed on range-limited match', t)
Fredrik Lundh1151a8c2000-08-08 16:47:42 +0000718
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000719 # Try the match with IGNORECASE enabled, and check that it
720 # still succeeds.
721 obj = re.compile(pattern, re.IGNORECASE)
722 result = obj.search(s)
Fred Drake132dce22000-12-12 23:11:42 +0000723 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000724 print('=== Fails on case-insensitive match', t)
Guido van Rossumdfa67901997-12-08 17:12:06 +0000725
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000726 # Try the match with LOCALE enabled, and check that it
727 # still succeeds.
728 obj = re.compile(pattern, re.LOCALE)
729 result = obj.search(s)
730 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000731 print('=== Fails on locale-sensitive match', t)
Guido van Rossumdfa67901997-12-08 17:12:06 +0000732
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000733 # Try the match with UNICODE locale enabled, and check
734 # that it still succeeds.
735 obj = re.compile(pattern, re.UNICODE)
736 result = obj.search(s)
737 if result is None:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000738 print('=== Fails on unicode-sensitive match', t)
Fredrik Lundh8e6d5712000-08-08 17:06:53 +0000739
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000740def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000741 run_unittest(ReTests)
Skip Montanaro1e703c62003-04-25 15:40:28 +0000742 run_re_tests()
Skip Montanaro8ed06da2003-04-24 19:43:18 +0000743
744if __name__ == "__main__":
745 test_main()