views:

149

answers:

2

Hi All-

I'm having a problem when trying to apply a regular expression to some strings encoded in latin-1 (ISO-8859-1).

What I'm trying to do is send some data via HTTP POST from a page encoded in ISO-8859-1 to my python application and do some parsing on the data using regular expressions in my python script.

The web page uses jQuery to send the data to the server and I'm grabbing the text from the page using the .text() method. Once the data is sent back to the server looks like this: re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*") - Unfortunately the \s in my regular expression is not matching my data, and I traced the problem down to the fact that the html page uses   which gets encoded to 0xA0 (non-breaking space) and sent to the server. For some reason, it seems, my script is not interpreting that character as whitespace and is not matching. According to the python [documentation][1] it looks like this should work, so I must have an encoding issue here.

I then wanted to try converting the string into unicode and pass it to the regular expression, so I tried to view what would happen when I converted the string: print(unicode(data, 'iso-8859-1')).

Unfortunately I got this error: UnicodeEncodeError at /script/ 'ascii' codec can't encode character u'\xa0' in position 122: ordinal not in range(128)

I'm confused though - I'm obviously not trying to use ASCII decoding - is python trying to decode using ASCII even though I'm obviously passing another codec?

+2  A: 

Try this instead:

print(repr(unicode(data, 'iso-8859-1')))

by printing a unicode object you're implicitly trying to convert it to the default encoding, which is ASCII. Using repr will escape it into an ASCII-safe form, plus it'll be easier for you to figure out what's going on for debugging.

Laurence Gonsalves
thanks, that was helpful!
Simon
+1, but note that this is helpful now, but not globally. You'd better start learning a bit about encoding if you want to avoid these problems.
e-satis
I'm not sure I understand your point - the helpful part was understanding that print() would implicitly convert to the default encoding.
Simon
+1  A: 

Are you using Python 3.X or 2.X? It makes a difference. Actually looks like 2.X but you confused me by using print(blahblah) :-)

Answer to your last question: Yes, ASCII by default when you do print(). On 3.X: Use print(ascii(foo)) for debugging, not print(foo). On 2.X use repr(), not ascii().

Your original problem with the no-break space should go away if (a) the data is unicode and (b) you use the re.UNICODE flag with the re.compile()

John Machin
Yep, 2.6- thanks for the `repr()` technique.Re: the original problem - `re.UNICODE` was the trick - THANKS!
Simon