diff -r 6b189f29b1e6 Lib/csv.py --- a/Lib/csv.py Wed Jun 05 18:37:50 2013 -0400 +++ b/Lib/csv.py Sat Jun 08 00:10:36 2013 +0800 @@ -264,8 +264,9 @@ # if we see an extra quote between delimiters, we've got a # double quoted format - dq_regexp = re.compile(r"((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$)" % \ - {'delim':delim, 'quote':quotechar}, re.MULTILINE) + dq_regexp = re.compile( + r"((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$)" % \ + {'delim':re.escape(delim), 'quote':quotechar}, re.MULTILINE) diff -r 6b189f29b1e6 Lib/test/test_csv.py --- a/Lib/test/test_csv.py Wed Jun 05 18:37:50 2013 -0400 +++ b/Lib/test/test_csv.py Sat Jun 08 00:10:36 2013 +0800 @@ -805,7 +805,7 @@ 'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow' 'Stonecutters ''Seafood'' and Chop House':'Lemont':'IL':'12/19/02':'Week Back' """ - header = '''\ + header1 = '''\ "venue","city","state","date","performers" ''' sample3 = '''\ @@ -824,10 +824,31 @@ sample6 = "a|b|c\r\nd|e|f\r\n" sample7 = "'a'|'b'|'c'\r\n'd'|e|f\r\n" + header2 = '''\ +"venue"+"city"+"state"+"date"+"performers" +''' + sample8 = """\ +Harry's+ Arlington Heights+ IL, 2/1/03+ Kimi Hayes +Shark City+ Glendale Heights+ IL, 12/28/02+ Prezence +Tommy's Place+ Blue Island+ IL, 12/28/02+ Blue Sunday/White Crow +Stonecutters Seafood and Chop House+ Lemont+ IL+ 12/19/02+ Week Back +""" + sample9 = """\ +Harry''s+ Arlington Heights+ IL, 2/1/03+ Kimi Hayes +Shark City+ Glendale Heights+ IL, 12/28/02+ Prezence +Tommy''s Place+ Blue Island+ IL, 12/28/02+ Blue Sunday/White Crow +Stonecutters ''Seafood'' and Chop House+ Lemont+ IL+ 12/19/02+ Week Back +""" + def test_has_header(self): sniffer = csv.Sniffer() self.assertEqual(sniffer.has_header(self.sample1), False) - self.assertEqual(sniffer.has_header(self.header+self.sample1), True) + self.assertEqual(sniffer.has_header(self.header1 + self.sample1), + True) + #test the delimiter which has special meaning in regex (such as +) + self.assertEqual(sniffer.has_header(self.sample8), False) + self.assertEqual(sniffer.has_header(self.header2 + self.sample8), + True) def test_sniff(self): sniffer = csv.Sniffer() @@ -864,10 +885,15 @@ def test_doublequote(self): sniffer = csv.Sniffer() - dialect = sniffer.sniff(self.header) + dialect = sniffer.sniff(self.header1) self.assertFalse(dialect.doublequote) dialect = sniffer.sniff(self.sample2) self.assertTrue(dialect.doublequote) + #test the delimiter which has special meaning in regex (such as +) + dialect = sniffer.sniff(self.sample8) + self.assertFalse(dialect.doublequote) + dialect = sniffer.sniff(self.sample9) + self.assertTrue(dialect.doublequote) if not hasattr(sys, "gettotalrefcount"): if support.verbose: print("*** skipping leakage tests ***")