我是极度反对使用Python 2的,但是可能有一些项目由于历史原因不得不使用Python 2,那么你可能会遇到一些非常诡异的问题。
这里给你看一个例子:
下面这一段函数,是从基于Python 2的一个Django项目中摘录出来的例子,让你看看Python 2 + print大法,会如何浪费你的时间。
def check_include(data): pattern = '你好.*?世界' print '========', data, '=========' if re.search(pattern, data): print '包含' return print '不包含'
这一段代码用于检查参数 data
中是否有『你好』和『世界』两个词语。
首先运行一下代码,可以看到如下的输出:
========别对我说你好,因为我不是世界=========
不包含
难道说pattern有问题?这一次改一下代码,把pattern也打印出来:
def check_include(data): pattern = '你好.*?世界' print '========', pattern, '========', data, '=========' if re.search(pattern, data): print '包含' return print '不包含'
这一次的输出为:
========你好.*?世界========别对我说你好,因为我不是世界=========
不包含
难道正则表达式写错了?于是在Python里面测试正则表达式,发现是可以正确识别的:
>>> import re >>> data = '别对我说你好,因为我不是世界' >>> pattern = '你好.*?世界' >>> re.search(pattern, data) <_sre.SRE_Match object at 0x109590ac0>
那么为什么代码放在一个项目里面就不能识别呢?
如果你继续使用print大法,你会花很长时间才能定位到问题。但如果你使用PyCharm的调试模式,那么你1秒钟就能找到问题。
我们来看看如果用调试模式,你会看到什么好东西:
注意红框框住的两个变量,data的数据类型是 unicode
而pattern的数据类型是 str
,由于数据类型不一样,所以导致了正则表达式无法识别。但是,如果你用print直接打印这两个变量,你是无法知道他们的数据类型不一样的!
要解决这个问题也非常简单,只需要修改定义 pattern
的这一行:
pattern = u'你好.*?世界'
一切就正常了。如下图所示。
这个问题告诉你如下三点:
- 别用Python 2!
- 如果必需用Python 2,请把所有字符串全部设置为
unicode
类型! - 不要使用print大法。善用调试功能!