五种Python转义表示法


Posted in Python onNovember 27, 2020

1. 为什么要有转义?

ASCII 表中一共有 128 个字符。这里面有我们非常熟悉的字母、数字、标点符号,这些都可以从我们的键盘中输出。除此之外,还有一些非常特殊的字符,这些字符,我通常很难用键盘上的找到,比如制表符、响铃这种。

为了能将那些特殊字符都能写入到字符串变量中,就规定了一个用于转义的字符 \ ,有了这个字符,你在字符串中看的字符,print 出来后就不一定你原来看到的了。

举个例子

>>> msg = "hello\013world\013hello\013python"
>>> print(msg)
hello
   world
     hello
        python
>>>

是不是有点神奇?变成阶梯状的输出了。

那个 \013 又是什么意思呢?

  • \ 是转义符号,上面已经说过
  • 013 是 ASCII 编码的八进制表示,注意前面是 0 且不可省略,而不是字母 o

把八进制的 13 转成 10 进制后是 11

五种Python转义表示法

对照查看 ASCII 码表,11 对应的是一个垂直定位符号,这就能解释,为什么是阶梯状的输出字符串。

五种Python转义表示法

2. 转义的 5 种表示法

ASCII 有 128 个字符,如果用 八进制表示,至少得有三位数,才能将其全部表示。这就是为什么说上面的首位 0 不能省略的原因,即使现在用不上,我也得把它空出来。

而如果使用十六进制,只要两位数就其 ASCII 的字符全部表示出来。同时为了避免和八进制的混淆起来,所以在 \ 后面要加上英文字母 x 表示十六进制,后面再接两位十六进制的数值。

  • \ 开头并接三位 0-7 的数值,表示 8 进制
  • \x 开头并接两位 0-f 的数值,表示 16进制

因此,当我定义一个字符串的值为 hello + 回车 + world 时,就有了多种方法:

# 第一种方法:8进制
>>> msg = "hello\012world"
>>> print(msg)
hello
world
>>> 

# 第二种方法:16 进制
>>> msg = "hello\x0aworld"
>>> print(msg)
hello
world
>>>

通常我们很难记得住一个字符的 ASCII 编号,即使真记住了,也要去转换成八进制或者16进制,实在是太难了。

因此对于一些常用并且比较特殊字符,我们习惯用另一种类似别名的方式,比如使用 \n 表示换行,它与 \012\x0a 是等价的。

与此类似的表示法,还有如下这些

五种Python转义表示法

于是,要实现 hello + 回车 + world ,就有了第三种方法

# 第三种方法:使用类似别名的方法
>>> msg = "hello\nworld"
>>> print(msg)
hello
world
>>>

到目前为止,我们掌握了 三种转义的表示法。

已经非常难得了,让我们的脑洞再大一点吧,接下来再介绍两种。

ASCII 码表所能表示字符实在太有限了,想打印一个中文汉字,抱歉,你得借助 Unicode 码。

Unicode 编码由 4 个16进制数值组合而成

>>> print("\u4E2D")
中

什么?我为什么知道 的 unicode 是 \u4E2D?像下面这样打印就知道啦

# Python 2.7
>>> a = u"中"
>>> a
u'\u4e2d'

由此,要实现 hello + 回车 + world ,就有了第四种方法。

# 第四种方法:使用 unicode ,\u000a 表示换行
>>> print('hello\u000aworld')
hello
world

看到这里,你是不是以为要结束啦?

不,还没有。下面还有一种。

Unicode 编码其实还可以由 8 个32进制数值组合而成,为了以前面的区分开来,这里用 \U 开头。

# 第五种方法:使用 unicode ,\U0000000A 表示换行
>>> print('hello\U0000000Aworld')
hello
world

好啦,目前我们掌握了五种转义的表示法。

总结一下:

  • \ 开头并接三位 0-7 的数值(八进制) — 可以表示所有ASCII 字符
  • \x 开头并接两位 0-f 的数值(十六进制) — 可以表示所有ASCII 字符
  • \u 开头并接四位 0-f 的数值(十六进制) — 可以表示所有 Unicode 字符
  • \U 开头并接八位 0-f 的数值(三十二进制)) — 可以表示所有 Unicode 字符
  • \ 开头后接除 x、u、U 之外的特定字符 — 仅可表示部分字符

为什么标题说,转义也可以炫技呢?

试想一下,假如你的同事,在打印日志时,使用这种 unicode 编码,然后你在定位问题的时候使用这个关键词去搜,却发现什么都搜不到?这就扑街了。

五种Python转义表示法

虽然这种行为真的很 sb,但在某些人看来也许是非常牛逼的操作呢?

五种转义的表示法到这里就介绍完成,接下来是更多转义相关的内容,也是非常有意思的内容,有兴趣的可以继续往下看。

3. raw 字符串

当一个字符串中具有转义的字符时,我们使用 print 打印后,正常情况下,输出的不是我们原来在字符串中看到的那样子。

那如果我们需要输出 hello\nworld ,不希望 Python 将 \n 转义成 换行符呢?

这种情况下,你可以在定义时将字符串定义成 raw 字符串,只要在字符串前面加个 r 或者 R 即可。

>>> print(r"hello\nworld")
hello\nworld
>>> 
>>> print(R"hello\nworld")
hello\nworld

然而,不是所有时候都可以加 r 的,比如当你的字符串是由某个程序/函数返回给你的,而不是你自己生成的

# 假设这个是外来数据,返回 "hello\nworld"
>>> body = spider()
>>> print(body)
hello
world

这个时候打印它,\n 就是换行打印。

4. 使用 repr

对于上面那种无法使用 r 的情况,可以试一下 repr 来解决这个需求:

>>> body = repr(spider())
>>> print(body)
'hello\nworld'

经过 repr 函数的处理后,为让 print 后的结果,接近字符串本身的样子,它实际上做了两件事

  1. \ 变为了 \\
  2. 在字符串的首尾添加 ' 或者 "

你可以在 Python Shell 下敲入 变量 回车,就可以能看出端倪。

首尾是添加 ' 还是 " ,取决于你原字符串。

>>> body="hello\nworld"
>>> repr(body)
"'hello\\nworld'"
>>> 
>>> 
>>> body='hello\nworld'
>>> repr(body)
"'hello\\nworld'"

5. 使用 string_escape

如果你还在使用 Python 2 ,其实还可以使用另一种方法。

那就是使用 string.encode('string_escape') 的方法,它同样可以达到 repr 的效果

>>> "hello\nworld".encode('string_escape')
'hello\\nworld'
>>>

6. 查看原生字符串

综上,想查看原生字符串有两种方法:

  • 如果你在 Python Shell 交互模式下,那么敲击变量回车
  • 如果不在 Python Shell 交互模式下,可先使用 repr 处理一下,再使用 print 打印
>>> body="hello\nworld"
>>> 
>>> body
'hello\nworld'
>>> 
>>> print(repr(body))
'hello\nworld'
>>>

7. 恢复转义:转成原字符串

经过 repr 处理过或者 \\ 取消转义过的字符串,有没有办法再回退出去,变成原先的有转义的字符串呢?

答案是:有。

如果你使用 Python 2,可以这样:

>>> body="hello\\nworld"
>>> 
>>> body
'hello\\nworld'
>>> 
>>> body.decode('string_escape')
'hello\nworld'
>>>

如果你使用 Python 3 ,可以这样:

>>> body="hello\\nworld"
>>> 
>>> body    
'hello\\nworld'
>>> 
>>> bytes(body, "utf-8").decode("unicode_escape")
'hello\nworld'
>>>

什么?还要区分 Python 2 和 Python 3?太麻烦了吧。

明哥教你用一种可以兼容 Python 2 和 Python 3 的写法。

首先是在 Python 2 中的输出

>>> import codecs 
>>> body="hello\\nworld"
>>> 
>>> codecs.decode(body, 'unicode_escape')
u'hello\nworld'
>>>

然后再看看 Python 3 中的输出

>>> import codecs
>>> body="hello\\nworld"
>>> 
>>> codecs.decode(body, 'unicode_escape')
'hello\nworld'
>>>

可以看到 Pyhton 2 中的输出 有一个 u ,而 Python 3 的输出没有了 u,但无论如何 ,他们都取消了转义。

到此这篇关于五种Python转义表示法的文章就介绍到这了,更多相关Python转义内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
python生成指定尺寸缩略图的示例
May 07 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
实例详解Python模块decimal
Jun 26 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
Python图片的横坐标汉字实例
Dec 04 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
尝试使用Python爬取城市租房信息
Apr 12 Python
Django如何继承AbstractUser扩展字段
Nov 27 #Python
如何使用 Flask 做一个评论系统
Nov 27 #Python
python+openCV对视频进行截取的实现
Nov 27 #Python
Python环境配置实现pip加速过程解析
Nov 27 #Python
python实现学生信息管理系统(精简版)
Nov 27 #Python
基于Python采集爬取微信公众号历史数据
Nov 27 #Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 #Python
You might like
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
vuejs指令详解
2017/02/07 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python中的默认参数详解
2015/06/24 Python
python比较两个列表是否相等的方法
2015/07/28 Python
详细分析python3的reduce函数
2017/12/05 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
世博会口号
2014/06/20 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
MySQL日期时间函数知识汇总
2022/03/17 MySQL