python为什么这么小_同样是 Python,怎么区别这么大

发现问题

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

上网搜了一圈,发现没有一篇文章讲述Python2和Python3的正则在处理字符串是的区别,都是一视同仁,知道我去翻了一遍官方文档,才明白怎么回事。

问题复现

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

有Python2代码如下:

~|⇒ python

Python 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 darwin

Type "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)

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

~|⇒ python3

Python 3.7.1 (default, Nov 28 2018, 11:55:14)

[Clang 9.0.0 (clang-900.0.39.2)] on darwin

Type "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,还有很多区别,这里就不一一列举了,欢迎大家留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dynamodb容器使用_使用DynamoDBMapper扫描DynamoDB项目

dynamodb容器使用之前,我们介绍了如何使用DynamoDBMapper或底层Java api查询DynamoDB数据库。 除了发出查询之外,DynamoDB还提供扫描功能。 扫描的目的是获取您在DynamoDB表上可能拥有的所有项目。 因此,扫描不需要任何基于我们的分区键或…

HH SaaS电商系统的商品营销标签功能模块设计

1、营销标签只属于商城,自营店铺共享商城的营销标签,第三方店铺可以申请营销标签 2、营销标签跟着商品走,关联spu_ext_id,多对多关系 3、一个商品最多添加5个营销标签

python加减法计算题 代码_关于《剑指offer》中不用加减乘除做加法的Python代码的问题...

题目如下:写一个函数,求两个整数之和,要求在函数体内不得使用、-、*、/四则运算符号。题目不难,可以采用位操作来实现,利用异或运算来计算不带进位的加法结果,利用与运算计算进位的标志,然后将这…

接口方法javadoc注释_继承Javadoc方法注释

接口方法javadoc注释尽管用于javadoc工具的JDK工具和实用程序页面通过实现和继承方法来描述Javadoc方法注释重用的规则,但是当实际上不需要使用{inheritDoc}时,很容易不必要地显式描述注释继承,因为会使用相同的注释隐式继承。 Java 8 javado…

HH SaaS电商系统的商品销售管理标签功能模块设计

1、商城和店铺有各自的销售管理标签 2、商品管理标签跟着商品走,关联spu_ext_id或者sku_ext_id,多对多关系

redis java 监听_从零手写实现redis(四)添加监听器

前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?本节,让我们…

neo4j导入两个文件_Neo4j:找到两个纬度/经度之间的中点

neo4j导入两个文件在过去的两个周末中,我一直在处理一些运输数据,并且我想运行A *算法来查找两个车站之间的最快路线。 A *算法将EstimateEvaluator作为其参数之一,并且该评估器查看节点的经度/纬度,以确定一条路径是否值得遵循。…

HH SaaS电商系统的商品营销服务功能模块设计

商品营销服务 1、服务只属于商城,自营店铺共享商城的服务,第三方店铺可以申请服务 2、服务跟着素材模板走,关联素材模板id,多对多关系

drill apache_如何指南:Apache Drill入门

drill apacheApache Drill是一个引擎,可以连接到许多不同的数据源,并为它们提供SQL接口。 它不仅是遍历任何复杂事物SQL界面,而且是功能强大的界面, 其中包括对许多内置函数和窗口函数的支持。 尽管它可以连接到可以使用SQL进行查…

mac mysql 重设密码_Mac下忘记mysql密码重新设置密码的图文教程

MySQL 文件在路径/usr/local/mysql下1, 在系统偏好设置中关闭 mysql : Stop MySQL Server2 ,打开终端进入路径  /usr/local/mysql/bin输入命令 sudo su, 然后输入开机密码。然后输入命令:./mysqld_safe –skip-grant-…

HH SaaS电商系统的商品销售分区功能模块设计

商品销售分区 1、销售分区跟着商品走,关联spu_ext_id,多对多关系 2、商城和店铺有各自的销售分区

spring 安全编码_Spring安全性和密码编码

spring 安全编码在以前的文章中,我们深入探讨了Spring安全性。 我们实现了由jdbc支持的安全性,基于自定义 jdbc查询的安全性以及从nosql数据库检索安全性的信息。 通过足够小心,我们会发现密码为纯文本格式。 尽管这在实际环境中可以很好地用…

python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践

蓝盟 IT小贴士,来喽!可以看出,a点附近的点密度大,红色的圆按照一定的规则在这里滚动,最终收纳a点附近的5点,标记为红色是同一个簇。其他没有收纳的东西,按照相同的规则进行集群化。从图像上来看…

HH SaaS电商系统的商品物流模板的功能设计

商品物流模板 1、物流模板跟着商品走,关联spu_ext_id,一对多关系 2、商城和店铺有各自的物流模板

activiti 变量_如何在Activiti中使用瞬态变量

activiti 变量我们昨天发布的Activiti v6 Beta3中已经加入了很多需要的功能-临时变量。 在这篇文章中,我将向您展示一个示例,说明如何使用瞬态变量来覆盖一些以前不可能(或最佳)的高级用例。 到目前为止,Activiti中的…

erosa mysql_MySQL协议和canal实现

前言前面的文章里,我们了解到 canal 可以从 MySQL 中感知数据的变化。这是因为它模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,从而实现了主从复制。正是了解到这一点,笔者有两个问题便一直萦绕于心:它是如何…

HH SaaS电商系统的商品关联版式功能模块设计

关联版式 1、关联版式跟着商品走,关联spu_ext_id,一对多关系 2、商城和店铺有各自的关联版式

spring nosql_使用Spring Security和NoSQL的Spring Boot

spring nosql在前面的文章中,我们从一个SQL数据库提供用户和权威检索自定义查询设置弹簧安全配置。 如今,许多现代应用程序都使用NoSQL数据库。 Spring安全性不是NoSQL数据库的现成解决方案。 在这种情况下,我们需要通过实现自定义UserDeta…

ofbiz修改mysql_如何将OFBIZG的默认数据库更改mysql的方法(只求参考 )

ofbiz自带的数据库是Derby,这是一种小型的适合与测试系统的数据库,但不适合在产品级系统中使用,所以通常我们需要将ofbiz迁移到其它数据库上,下面我就以如何迁移至mysql为例,向大家讲述数据库迁移过程,迁移至其它数据库的过程类似.第一步:修改entityengine.xml文件.该文件的位置…

HH SaaS电商系统的供应商系统设计

供应商信息结构图 供应商类型 商城的供应商划分为专享型、共享型两种,但是租户和店铺供应商则都是“专享型”的。 共享型供应商发布的商品归属供应商自己的,商品档案供应商才有资格管理,所以spu_base需要保存供应商id,有供应商id…