前言

Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文。

所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #coding=utf-8。

这是指定一种编码格式,意味着用该编码存储中文字符(也可以是gbk、gb2312等)。

关于测试的几点注意 --------------------------------------------

注1:代码中有中文,就要在头部指定编码方式,如果用编辑器写代码,还要注意IDE的文件存储编码格式(一般在setting)

注2:python3.x的源码文件默认使用utf-8编码,可以解析中文,开头不指定也行,但为了规范和避免一些意想不到的问题,都指定一下为好

注3:linux交互式命令(左)和py文件(右)的运行结果会有不同:

左图,因为我cmd设置了gbk编码格式,所以u是s用gbk解码后的unicode对象,配套的解编码才能使原中文字符在print下正常显示,所以再用gbk编码;右图,py文件指定了utf8编码,所以u是s用utf8解码后的unicode对象(其他方式会运行错误),而且想要在屏幕上打印出中文,还须encode成cmd设置的编码(其他方式显示乱码)。

注4:测试中文字符的显示和匹配时,最好用py文件写,否则遇到两边不一样的情况就会感到十分坑爹

----------------------------------------------------------------

下面实验是基于python2.7和linux系统,不测试windows控制台和windows下的IDE;

下面实验是关于为了正常显示中文和正则匹配中文的转码测试。

(一)python的str和中文字符串

简单理解,编码意味着 unicode -> ch-str,解码意味着 ch-str -> unicode,

关于print显示中文。举个例子,用gb18030和utf-8编码的内容相同的两份文档测试:

#coding=utf-8

import sys

with open('ch_input_gbk', 'r') as f1, open('ch_input_utf', 'r') as f2:

for l1 in f1:

lines = l1.strip().split('\t') # lines是list, 通过打印它可以看看str不同编码的内容

sent = lines[0] # sent是ch-str

print lines, sent

for l2 in f2:

lines = l2.strip().split('\t')

sent = lines[0]

print lines, sent

print sent.decode('utf8').encode('gbk')

#print str(sent).decode('string_escape').decode('utf8').encode('gbk')

输出:

['\xd3\xc4\xc8\xcb\xd6\xf1\xc9\xa3\xd4\xb0'] 幽人竹桑园

['\xb9\xe9\xce\xd4\xbc\xc5\xce\xde\xd0\xfa'] 归卧寂无喧

['\xce\xef\xc7\xe9\xbd\xf1\xd2\xd1\xbc\xfb'] 物情今已见

['\xb4\xd3\xb4\xcb\xd3\xfb\xce\xde\xd1\xd4'] 从此欲无言

['\xe5\xb9\xbd\xe4\xba\xba\xe7\xab\xb9\xe6\xa1\x91\xe5\x9b\xad'] 骞戒汉绔规鍥

幽人竹桑园

['\xe5\xbd\x92\xe5\x8d\xa7\xe5\xaf\x82\xe6\x97\xa0\xe5\x96\xa7'] 褰掑崸瀵傛棤鍠

归卧寂无喧

['\xe7\x89\xa9\xe6\x83\x85\xe4\xbb\x8a\xe5\xb7\xb2\xe8\xa7\x81'] 鐗╂儏浠婂凡瑙

物情今已见

['\xe4\xbb\x8e\xe6\xad\xa4\xe6\xac\xb2\xe6\x97\xa0\xe8\xa8\x80'] 浠庢娆叉棤瑷

从此欲无言

line7,f1的sent正常显示是因为,txt是gb18030编码,读入后仍为此(这与首行的#coding可不一样),我的cmd同样也是gb18030

line11,f2的sent乱码显示是因为,txt是utf8编码,读入后仍为此,但是print对str是按cmd设置的编码格式解读的

line12,sent又能正常显示是因为,utf8解码 -> unicode -> 编码为gb18030,所以print可以正常解读了

line13,有时读入或抓取的中文不是\xd3\xc4而是这个样子的\\xd3\\xc4,这是\被转义了,对它无法做decode转换编码,先用str(sent).decode('string_escape'),把反斜杠的转义去掉,然后就和第12行一样了

附,12行如果直接写 sent.encode('gbk') 会报错:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0

是说,当前位置这个str不能被py默认的ascii解码,因为它是中文str;要用它的实际编码来解码而不是ascii:

1 修改py默认编码,由ascii改为当前str实际编码(utf8或gb18030等)

reload(sys)

sys.setdefaultencoding('utf8')

2 但是读入多个文档含有多个编码方式时,1的方法就不方便,还是对不同的ch-str都采用unicode转换编码较好 (上面例子中的方式)

(二)中文字符串的正则匹配

只有一项标准,匹配字符串和原字符串编码统一,

还是举例子,

# -*- coding: utf-8 -*-

import re

def findPart(regex, text, name):

res = re.findall(regex, text)

print "There are %d %s parts:" % (len(res), name)

for r in res:

print r.encode('gbk')

sample = '''en: Regular expression is a powerful tool for manipulating text.

zh: 正则表达式是一种很有用的处理文本的工具。

jp: 正規表現は非常に役に立つツールテキストを操作することです。

jp-char: あアいイうウえエおオ

kr:정규 표현식은 매우 유용한 도구 텍스트를 조작하는 것입니다.

puc: ,。?!:,.?!:《》%&*#<>%&*#

'''

#convert the utf8 to unicode

usample = unicode(sample,'utf8') #相当于usample = sample.decode('utf8')

#get each language parts:

findPart(u"[\u4e00-\u9fa5]+", usample, "unicode chinese")

findPart(u"[\uac00-\ud7ff]+", usample, "unicode korean")

findPart(u"[\u30a0-\u30ff]+", usample, "unicode japanese katakana")

findPart(u"[\u3040-\u309f]+", usample, "unicode japanese hiragana")

findPart(u"[\u3000-\u303f\ufb00-\ufffd]+", usample, "unicode cjk Punctuation")

line20,目标字符串usample是unicode类型,故匹配字符串regex也要同(如u"[\u4e00-\u9fa5]+"),u就是转成unicode;

line7,usample是unicode,要想print正确显示,则需要r.encode('gbk'),根据cmd的编码格式;

正则匹配规则不多述,[\u????-\u????] 是不同语言的unicode编码段,该例输出是,

中文6个part:正则表达式是一种很有用的处理文本的工具、正規表現、非常、役、立、操作

韩文8个part:정규、표현식은、매우、유용한、도구、텍스트를、조작하는、것입니다

日文片假名6个part:ツールテキスト、ア、イ、ウ、エ、オ

日文平假名11个part:は、に、に、つ、を、することです、あ、い、う、え、お

非英文标点4个part:。、。、,。?!:、《》%&*#

另外,简单的正则匹配,举几个例子,

s1 = '天天天向上天天向上'

print (re.sub(ur'[\u4e00-\u9fa5]{1,}', u'1', s1.decode('utf8'))).encode('gbk') # 1

print (re.sub(ur'([\u4e00-\u9fa5])\1{1,}', u'1', s1.decode('utf8'))).encode('gbk') # 1向上1向上

print (re.sub(ur'([\u4e00-\u9fa5])\1{2,}', u'1', s1.decode('utf8'))).encode('gbk') # 1向上天天向上

s2 = '【aa】天天bb@cc'

print (re.sub(ur'【.*】', u'1', s2.decode('utf8'))).encode('gbk') # 1天天bb@cc

print (re.sub(ur'@', u'1', s2.decode('utf8'))).encode('gbk') # 【aa】天天bb1cc

line2,{1,}匹配1~n个前面表达式,故6个汉字全部匹配

line3,()内为一个group,\1指第一个group,{1,}要再匹配1~n个前面group内容(若group内是1个字, {1,}要匹配第2个及往后的字),故匹配了3个天和2个天

line6和7,中英文标点符号匹配,regex没有转义符的话可以不写r,若text全是英文也可以不写u

以上这篇浅谈python下含中文字符串正则表达式的编码问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题相关推荐

  1. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  2. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  3. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  4. python数据类型转换原因_浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...

  5. python列表使用判断_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

  6. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  7. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  9. python 中arange函数_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

最新文章

  1. 老李秘技:loadrunner11是否还支持dblib协议?
  2. java入门第六天课程_java基础第六天
  3. 适合于小团队产品迭代的APP测试流程
  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块
  5. ubuntu下查看caj文件
  6. (1)dotnet开源电商系统-brnshopbrnMall 和老外开发的nopCommerce(dotnet两套电商来PK--第一篇)...
  7. 数据结构(七)图的遍历(递归非递归方法)
  8. html提交列表编号自动生成目录,解析 Html 自动生成目录 TOC 的相关代码
  9. 基于angular实现模拟微信小程序swiper组件
  10. Java生成、解析二维码方案以及代码实现
  11. 企业网络管理利器-SpiceWorks(1)
  12. 决定一台计算机运行速度快慢的配件是什么,电脑运行慢换什么配件
  13. spider pi 智能视觉六足机器人 开箱介绍 0602
  14. 实现计算机联网的最大好处是,职.称计算机考试多项选择题考试卷模拟考试题...
  15. springboot vue mybatis mysql校园疫情数据分析平台源码
  16. 襄阳教育云平台实名认证_襄阳教育云平台登录入口下载|襄阳教育云平台手机版登录入口 V3.8.7-清风安卓软件网...
  17. dss nginx 403 forbidden
  18. 错误 C4996 inet_addr: Use inet_pton() or InetPton() instead or defin
  19. 配电房环境智能监测系统及轨道巡检机器人
  20. Erro和Exception区别Throw和Throws的区别

热门文章

  1. InnoDB的MVCC如何解决幻读
  2. mysql merge 分区
  3. Android之文件数据存储
  4. okhttp通过post发送Json数据到php 更新数据库
  5. 《切入口web教学——使用firebug调试css代码》录制完成
  6. linux 更改服务的启动顺序
  7. 局域网通知系统(消息群发)
  8. [Dynamic Language] Python 静态方法、类方法、属性
  9. 下划线转驼峰,并且首字母大写
  10. top_k问题python解