python中正则表达式在中文字符串匹配时的坑

  之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因。今天终于彻底弄懂了,原来还是python中对中文的编码问题造成的。

  解决办法:

    step1 在设置默认编码为UTF8之后,将正则表达式和待匹配字符串都decode("utf8")统一成 unicode再进行匹配;

    step2 正则表达式前面一定要加 r ;

示例代码:

        kw_regexp = r‘微信‘+ kw_str.decode("utf8")
        pattern = re.compile(kw_regexp, re.I)
        result = pattern.search(cont.decode("utf8"))

其中,cont是待匹配字符串,kw_regexp是拼接来的正则表达式字符串,前面一定要加"r"。

原文地址:https://www.cnblogs.com/zichun-zeng/p/10447114.html

时间: 2024-08-11 01:19:02

python中正则表达式在中文字符串匹配时的坑的相关文章

Python中urllib.urlencode中文字符的一个问题

Django项目在访问Restful service时调用urllib.urlencode编码中文字符串时碰到下面这个错误. v = quote_plus(str(v)) UnicodeEncodeError: 'ascii' codec can't encode characters in position........... 这个错误在windows7的开发环境下没有发生,在Linux生产环境下发生了,比较郁闷,刚上线以后的Bug.Google以后,在一份中文资料(链接见参考资料)中看到U

python 中正则表达式

. 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 代码/语法 说明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 [aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!). [0-9]代表的含意与\d就是完全一致的:一位数字:同理[a-z0-9A-Z_]也完

判断一个字符串中是否含有中文字符:

python中的encode和decode: 首先,在Python中字符串的表示是 用unicode编码.所以在做编码转换时,通常要以unicode作为中间编码. decode的作用是将其他编码的字符串转换成unicode编码,比如 a.decode('utf-8'),表示将utf-8编码的字符串转换成unicode编码 encode的作用是将unicode编码的字符串转换成其他编码格式的字符串,比如b.encode('utf-8'),表示将unicode编码格式转换成utf-8编码格式的字符串

python中os模块中文帮助

python中os模块中文帮助 python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8,个人博客:http://butlandblog.appspot.com/ 注此模块中关于unix中的函数大部分都被略过,翻译主要针对WINDOWS,翻译速度很快,其中很多不足之处请多多包涵. 这个模块提供了一个轻便的方法使用要依赖操作系统的功能. 如何你只是想读或写文件,请使用open() ,如果你想

iOS开发之获取一段字符串中的中文字和中文字符

#pragma mark -获取一段字符串中的中文字 + (NSArray *)getAStringOfChineseWord:(NSString *)string { if (string == nil || [string isEqual:@""]) { return nil; } NSMutableArray *arr = [[NSMutableArray alloc]init]; for (int i=0; i<[string length]; i++) { int a

判断 sql 中是否含有中文字符-----待验证

select ascii(字段)数字:48-57字母:65-123汉字:123+ select * from t1 where len(unicode(c1)) < 5; 判断c1第一个字符是否是中文,小于5,非中文 SQL判断某列中是否包含中文字符.英文字符.纯数字 一.包含中文字符 select * from 表名 where 列名 like '%[吖-座]%' 二.包含英文字符 select * from 表名 where 列名 like '%[a-z]%' 三.包含纯数字 select

python 中 正则表达式(Regular Expressions)学习

刚接触了python中的re模块,由于之前没有对正则表达式进行系统性的学习,学起来很费劲,因此写下这篇博客进行积累和巩固,以备后用. 正则表达式的应用是非常广泛的,不论是在linux中还是在编程中,我们总会遇到正则表达式,借着学习python的机会,也稍微系统的学习一下正则表达式. 自己看了下正则表达式的帮助文档,也在Internet上看了一些相关的资料,网上的资料对这个介绍的还是很多的. 以下为自己的学习经历: '*'  这个符号在通配符中是最经常使用的,我们常常用它来匹配任意的字符,在RE中

关于Python中正则表达式的反斜杠问题

之前总是搞不明白正则表达式中的反斜杠的问题.今天经过查阅资料终于搞明白了. 其中最重要的一点就是Python自己的字符串中定义的反斜杠也是转义字符,而正则表达式中的反斜杠也是转义字符,所以正则表达式中反斜杠会涉及到双重转换的问题. 要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定

第五章 python中正则表达式的使用

第一节    正则表达式的一些介绍 1)掌握正则表达式的案例 2)写一个小爬虫 3)正则表达式(或RE)是一个小型的.高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现. - 可以为想要匹配的相应字符串集指定规则 - 该字符串集可能包含英文语句.e-mail地址.命令或任何你想搞定的东西 - 可以问诸如“这个字符串匹配该模式吗?” - “在这个字符串中是否有部分匹配该模式呢?” - 你也可以使用RE以各种方式来修改或分割字符串. 4)正则表达式模式被编译成一系列