正则匹配中文及字符编码问题

匹配中文的正则表达式

窝写了一小段代码(虽然写的不太好,但是基本可以表达意思)

1
2
3
4
5
6
7
8
import re
nickname = raw_input('Please input your nickname > ')
if not re.search(u'^[\u4e00-\u9fa5a-zA-Z0-9]+$', unicode(nickname,'utf8')):
print 'Your nickname format is error, please try again !'
else:
print 'Hello %s'% nickname

如你所见,上面第5行的代码,就是匹配中文和字母,数字的正则表达式了。里面的\u4e00-\u9fa5 就是中文汉字的unicode编码所在位置。

运行截图


Python字符串的编码问题

还是以上面那段代码来说。注意看第5行的代码

1
if not re.search(u'^[\u4e00-\u9fa5a-zA-Z0-9]+$', unicode(nickname,'utf8')):

其实这样的代码并不严谨。因为在Python 中默认是用unicode编码来处理字符串的,因此做编码转换的时候,一般要以unicode作为中间编码,也就是说:
其他编码格式的字符串—>解码(decode)—>unicode—>编码(encode)—>所需要的编码格式。

因此,处理字符串编码的问题的时候,先要明白需要转换的字符串的编码格式是什么。

代码中字符串的默认编码格式与代码文件本身的编码格式是一样的

比如: s = ‘涛’ 在utf8的文件中,那么s就是utf8编码的,但是如果文件是gb2312编码,那么s就是gb2312编码的。此时,如果想要处理s这个字符串就要先decode成unicode编码了。

不过如果是酱紫 s = u’涛’,那么s就是unicode编码了,这个时候s的编码方式不会被文件的编码所影响。

如果一个字符串已经是unicode编码了,再解码就会出错

因此严谨的方式就是先对字符串进行编码格式的判别,最简单的办法就是使用Python 默认提供的isinstance() 方法.

代码可以这样写
isinstance(s, unicode) 如果不是unicode编码就会报错。

窝今天在处理用户昵称的地方,忘记字符串会直接使用文件的编码了,所以对它进行了重新编码orz果断就报错了。。。以后还是要好好注意细节的说。