How to 'de-slashify' a string?

AK ak at nothere.com
Sat Aug 22 12:52:53 CEST 2009


Vlastimil Brom wrote:
> 2009/8/22 AK <ak at nothere.com>:
>> Steven D'Aprano wrote:
>>> On Sat, 22 Aug 2009 04:20:23 -0400, AK wrote:
>>>
>>>> Hi, if I have a string '\\303\\266', how can I convert it to '\303\266'
>>>> in a general way?
>>> It's not clear what you mean.
>>>
>>> Do you mean you have a string '\\303\\266', that is:
>>>
>>> backslash backslash three zero three backslash backslash two six six
>>>
>>> If so, then the simplest way is:
>>>
>>>>>> s = r'\\303\\266'  # note the raw string
>>>>>> len(s)
>>> 10
>>>>>> print s
>>> \\303\\266
>>>>>> print s.replace('\\\\', '\\')
>>> \303\266
>>>
>>>
>>> Another possibility:
>>>
>>>>>> s = '\\303\\266'  # this is not a raw string
>>>>>> len(s)
>>> 8
>>>>>> print s
>>> \303\266
>>>
>>> So s is:
>>> backslash three zero three backslash two six six
>>>
>>> and you don't need to do any more.
>> Well, I need the string itself to become '\303\266', not to print
>> that way. In other words, when I do 'print s', it should display
>> unicode characters if my term is set to show them, instead of
>> showing \303\266.
>>
>>>
>>>> The problem I'm running into is that I'm connecting with pygresql to a
>>>> postgres database and when I get fields that are of 'char' type, I get
>>>> them in unicode, but when I get fields of 'byte' type, I get the text
>>>> with quoted slashes, e.g. '\303' becomes '\\303' and so on.
>>> Is pygresql quoting the backslash, or do you just think it is quoting the
>>> backslashes? How do you know? E.g. if you have '\\303', what is the length
>>> of that? 4 or 5?
>> Length is 4, and I need it to be length of 1. E.g.:
>>
>>>>> s = '\303'
>>>>> s
>> '\xc3'
>>>>> x = '\\303'
>>>>> x
>> '\\303'
>>>>> len(x)
>> 4
>>>>> len(s)
>> 1
>>
>>
>> What I get from pygresql is x, what I need is s. Either by asking pygresql
>> to do this or convert it afterwards. I can't do replace('\\303', '\303')
>> because it can be any unicode character.
>>
>>>
>>
>> --
>> AK
>> --
>> http://mail.python.org/mailman/listinfo/python-list
>>
> 
> 
> Hi,
> do you mean something like
> 
>>>> u"\u0303"
> u'\u0303'
>>>> print u"\u0303"
> ̃
>     ̃ (dec.: 771)  (hex.: 0x303)   ̃ COMBINING TILDE (Mark, Nonspacing)
> ?
> 
> vbr

Yes, something like that except that it starts out as '\\303\\266', and 
it's good enough for me if it turns into '\303\266', in fact that's 
rendered as one unicode char. In other words, when you do:

 >>> print "\\303\\266"
'\303\266'

I need that result to become a python string, i.e. the slashes need to
be converted from literal slashes to escape slashes.




-- 
AK



More information about the Python-list mailing list