我是极度反对使用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'你好.*?世界'一切就正常了。如下图所示。

这个问题告诉你如下三点:
unicode类型!