Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Quoting quotes

0 views
Skip to first unread message

candide

unread,
Feb 26, 2010, 7:29:04 AM2/26/10
to
Suppose you have to put into a Python string the following sentence :

The play "All's Well That Ends Well" by Shakespeare

It's easy do it :

>>> print """The play "All's Well That Ends Well" by Shakespeare"""
The play "All's Well That Ends Well" by Shakespeare

Now, change the sentence to this one :

The play "All's Well That Ends Well"

Using triple single quotes works fine

>>> print '''The play "All's Well That Ends Well"'''
The play "All's Well That Ends Well"


But the first method doesn't run correctly :


>>> print """The play "All's Well That Ends Well""""
File "<stdin>", line 1
print """The play "All's Well That Ends Well""""
^
SyntaxError: EOL while scanning single-quoted string
>>>


Any comment ?


Ivan Šipoš

unread,
Feb 26, 2010, 7:37:10 AM2/26/10
to pytho...@python.org
Well, there's no such thing as """" defined in python.

Victor Stinner

unread,
Feb 26, 2010, 7:42:46 AM2/26/10
to pytho...@python.org
Le vendredi 26 février 2010 13:29:04, candide a écrit :
> But the first method doesn't run correctly :
> >>> print """The play "All's Well That Ends Well""""
>
> File "<stdin>", line 1
> print """The play "All's Well That Ends Well""""
> ^
> SyntaxError: EOL while scanning single-quoted string

Use triple simple single quotes:

>>> print '''"All's Well That Ends Well"'''


"All's Well That Ends Well"

--
Victor Stinner
http://www.haypocalc.com/

Steven D'Aprano

unread,
Feb 26, 2010, 9:04:35 AM2/26/10
to
On Fri, 26 Feb 2010 13:29:04 +0100, candide wrote:

> But the first method doesn't run correctly :
>
>
>>>> print """The play "All's Well That Ends Well""""
> File "<stdin>", line 1
> print """The play "All's Well That Ends Well""""
> ^
> SyntaxError: EOL while scanning single-quoted string
>>>>
>>>>
>
> Any comment ?

Of course not. Quotes can't be nested, so the first time the parser hits
three quote marks, you have reached the end of the string. You then open
a new string with a single quote mark, and then fail to close it. Hence
the EOL while scanning a single-quoted string.

There are many solutions. Here are four:

>>> print """The play "All's Well That Ends Well\""""
The play "All's Well That Ends Well"
>>> print '''The play "All's Well That Ends Well"'''
The play "All's Well That Ends Well"
>>> print 'The play "All\'s Well That Ends Well"'
The play "All's Well That Ends Well"
>>> print 'The play "All' "'" 's Well That Ends Well"'
The play "All's Well That Ends Well"

--
Steven

Grant Edwards

unread,
Feb 26, 2010, 10:04:04 AM2/26/10
to
On 2010-02-26, Steven D'Aprano <st...@REMOVE-THIS-cybersource.com.au> wrote:
> On Fri, 26 Feb 2010 13:29:04 +0100, candide wrote:
>
>> But the first method doesn't run correctly :
>>
>>
>>>>> print """The play "All's Well That Ends Well""""
>> File "<stdin>", line 1
>> print """The play "All's Well That Ends Well""""
>> ^
>> SyntaxError: EOL while scanning single-quoted string
>>>>>
>>>>>
>>
>> Any comment ?
>
> Of course not. Quotes can't be nested, so the first time the
> parser hits three quote marks, you have reached the end of the
> string. You then open a new string with a single quote mark,
> and then fail to close it. Hence the EOL while scanning a
> single-quoted string.

IMO, the error message is misleading to many people, since in
many/most contexts the term "single-quoted" refers to this:

'here is a single quoted string'

And not this:

"this is a double-quoted string"

--
Grant Edwards grante Yow! And then we could sit
at on the hoods of cars at
visi.com stop lights!

William Lohrmann

unread,
Feb 26, 2010, 11:04:55 AM2/26/10
to

The best thing would be to backslash the single quote: print 'The play
"All\'s Well That Ends Well"'

Lawrence D'Oliveiro

unread,
Feb 26, 2010, 5:22:09 PM2/26/10
to
In message
<bda4748c-49ec-4383...@l19g2000yqb.googlegroups.com>, William
Lohrmann wrote:

> The best thing would be to backslash the single quote: print 'The play
> "All\'s Well That Ends Well"'

Backslash-type escapes are the most general solution to this type of
problem. They’re also the easiest to apply automatically:

for ch in input_string :
if ch in troublesome_lot :
output backslash + tame representation of ch
else :
output ch
#end if
#end for

candide

unread,
Feb 28, 2010, 5:46:22 PM2/28/10
to
OK, now I see the point. I was mistaken because I was supposing that
every quote strictly _inside_ the string have to match another quote od
the same type.

Thanks to all for yours responses.

0 new messages