资讯专栏INFORMATION COLUMN

同样是Python,Python3和Python2怎么区别这么大?

Raaabbit / 2966人阅读

摘要:可是当我测试,我就懵逼了,中文真都验证通过,不对啊,我以前也是这么过滤参数的,测试没问题啊唯一的区别是现在用的是。

上周,我的测试同事告诉我,你的用户名怎么还允许中文啊?当时我心里就想,你们测试肯定又搞错接口了,我用的是正则w过滤了参数,怎么可能出错,除非Python正则系统出错了,那是不可能的。本着严谨的作风,我自己先测试一下,没问题看我怎么怼回去。可是当我测试,我就懵逼了,中文真TM都验证通过,不对啊,我以前也是这么过滤参数的,测试没问题啊?唯一的区别是现在用的是Python3。
上网搜了一圈,发现没有一篇文章讲述Python2和Python3的正则在处理字符串是的区别,都是一视同仁,知道我去翻了一遍官方文档,才明白怎么回事。

问题复现

我们都知道,Python有个正则规则w,几乎所有的网上博客文章都告诉你,这个规则匹配字母数字及下划线,但实际并不是这样:
有Python2代码如下:

~|⇒ pythonPython 2.7.10 (default, Aug 17 2018, 19:45:58)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import re>>> aa = "捕蛇者说">>> re.match("w{1,20}", aa)>>> bb = "abc123ADB">>> re.match("w{1,20}", bb)
<_sre.SRE_Match object at 0x1031b0b28>

我们可以看到,在python2中,w是无法匹配中文的。那么,同样的代码在Python3中运行结果是什么样子的了?

~|⇒ python3Python 3.7.1 (default, Nov 28 2018, 11:55:14)
[Clang 9.0.0 (clang-900.0.39.2)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import re>>> aa = "捕蛇者说">>> re.match("w{1,20}", aa)
>>> bb = "abc123ADB">>> re.match("w{1,20}", bb)


但在Python3中w是可以匹配中文的,这是怎么回事了?要回答这个问题,我们要回到Python官方文档中来寻找答案。

解决问题

当我们仔细阅读Python的官方文档时,就会发现,对于同样的正则规则w,Python2和Python3区别好大,我们先来看看Python2:

When the LOCALE and UNICODE flags are not specified, matches any alphanumeric character and the underscore; this is equivalent to the set [a-zA-Z0-9_]. With LOCALE, it will match the set [0-9_] plus whatever characters are defined as alphanumeric for the current locale. If UNICODE is set, this will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.

翻译一下:当没有设置LOCALE(re.L)和UNICODE(re.U)标志,匹配数字字母和下划线,如果设置了LOCALE(re.L)则匹配数字下划线和LOCALE文字。如果设置了UNICODE(re.U)标志,匹配数字下划线和Unicode字符集里的字符。

那么Python3了:

对于 Unicode (str) 样式:
匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。如果设置了 ASCII 标志,就只匹配 [a-zA-Z0-9_] 。
对于8位(bytes)样式:
匹配ASCII字符中的数字和字母和下划线,就是 [a-zA-Z0-9_] 。如果设置了 LOCALE 标记,就匹配当前语言区域的数字和字母和下划线。

到此,我明白了,默认情况下,不设置任何标志,Python2 w匹配ASCII字符集里的字符,包括数字字符和下划线,Python3 w匹配数字下划线和Unicode字符集。所以,为了迁移方便,如果你想匹配ASCII字符集里的字符,指定标志为re.A,如果你想匹配Unicode字符集里的字符,指定标志为re.U。

总结

到此,我的问题是彻底解决了,但也有两个教训:

看网上的教程要多注意,特别是教程里的环境和自己环境的区别

多看官方文档

关于Python2和Python3,还有很多区别,这里就不一一列举了,欢迎大家留言讨论。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44014.html

相关文章

  • 同样Python怎么区别这么

    摘要:可是当我测试,我就懵逼了,中文真都验证通过,不对啊,我以前也是这么过滤参数的,测试没问题啊唯一的区别是现在用的是。 发现问题 上周,我的测试同事告诉我,你的用户名怎么还允许中文啊?当时我心里就想,你们测试肯定又搞错接口了,我用的是正则w过滤了参数,怎么可能出错,除非Python正则系统出错了,那是不可能的。本着严谨的作风,我自己先测试一下,没问题看我怎么怼回去。可是当我测试,我就懵逼了...

    lovXin 评论0 收藏0
  • 学了这么久的Python,这些知识点都掌握了吗?

    摘要:最近有粉丝在群里提出建议,找一小部分人组建一个小的学习小组,一起学自动化,对于学习这种事情,当然是好的,正好我自己最近也有计划要从头开始系统学一下自动化,与我的想法不谋而合,于是,就有了这第一篇文章。 最近有粉丝在群里提出建议,找一小部分人组建一个小的学习小组,一起学python自动化,对于...

    zhongmeizhi 评论0 收藏0
  • Jupyter Notebook之初识及入门

    摘要:所以,应该直接了当的安装,其中也会自动安装上,作为其运行的。这只是一开始,之后还有里各种找不到外部安装的的情况。终于,意识到这些方法都是错误的思路。这才知道原来是无法识别。 为什么要用IPython/Jupyter? python里面调试确实有点烦恼,尤其是在vim里,想要尝试一些简单的编码问题,实在是有点麻烦,不想到命令行模式一行一行执行,也不想再新建一个文件测试一个简单的功能。 而...

    plus2047 评论0 收藏0
  • Jupyter Notebook之初识及入门

    摘要:所以,应该直接了当的安装,其中也会自动安装上,作为其运行的。这只是一开始,之后还有里各种找不到外部安装的的情况。终于,意识到这些方法都是错误的思路。这才知道原来是无法识别。 为什么要用IPython/Jupyter? python里面调试确实有点烦恼,尤其是在vim里,想要尝试一些简单的编码问题,实在是有点麻烦,不想到命令行模式一行一行执行,也不想再新建一个文件测试一个简单的功能。 而...

    fredshare 评论0 收藏0

发表评论

0条评论

Raaabbit

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<