0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python转义字符的表示方法

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-04-11 15:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 为什么要有转义?

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

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

举个例子

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

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

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

\ 是转义符号,上面已经说过

013 是 ASCII 编码的八进制表示,注意前面是 0 且不可省略,而不是字母 o

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

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

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 是等价的。

于是,要实现 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 编码,然后你在定位问题的时候使用这个关键词去搜,却发现什么都搜不到?这就扑街了。

虽然这种行为真的很 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 后的结果,接近字符串本身的样子,它实际上做了两件事

\ 变为了 \\

在字符串的首尾添加 ' 或者 "

你可以在 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
    +关注

    关注

    57

    文章

    4857

    浏览量

    89577
  • 转义字符
    +关注

    关注

    0

    文章

    3

    浏览量

    842
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Python调用API教程

    两个不同系统之间的信息交互。在这篇文章中,我们将详细介绍Python调用API的方法和技巧。 一、用Requests库发送HTTP请求 使用Python调用API的第一步是发送HTTP请求,通常
    的头像 发表于 11-03 09:15 324次阅读

    Python字符串逆序有几种方式,代码是什么

    对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,今天总结了一下python中对于
    的头像 发表于 08-28 14:44 776次阅读

    电阻上的数字如何表示电阻大小?

    大小的方法。 一、直标法 直标法是最直接、最简单的电阻值表示方法。在这种方法中,电阻的阻值直接用数字和文字符号标注在电阻体上。例如,电阻上标
    的头像 发表于 06-09 14:38 2510次阅读
    电阻上的数字如何<b class='flag-5'>表示</b>电阻大小?

    WP4000变频功率分析仪的精度表示与常规仪表精度表示方法有什么不同?

    目前,测量仪器的精度表示方法一般是“相对误差”或者是“引用误差”,相对来说市面上采用“引用误差”表示方法的仪器占大部分,而WP4000变频功率分析仪是目前市面上唯一一款采用“相对误差”
    的头像 发表于 05-13 09:58 469次阅读

    复合光缆型号怎么表示

    复合光缆的型号表示方法通常遵循一定的命名规则,这些规则有助于用户识别光缆的特性、用途和规格。以下是对复合光缆型号表示方法的详细解释: 一、型号构成 复合光缆的型号通常由光缆型式的代号和
    的头像 发表于 03-18 09:50 1318次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-字符驱动之字符驱动描述

    基本组件:设备文件:字符驱动通过在文件系统中创建设备文件来表示字符设备。应用程序可以通过打开设备文件来访问字符设备。初始化和清理函数:字符
    发表于 03-14 09:51

    在深度学习工作台中安装Python软件包报错怎么解决?

    在 DL 工作台中导入的模型。 在准备将导入的模型转换为中间表示 (IR) 时收到错误: Cannot install packages for python /home/workbench/.workbench/environments/2/bin/
    发表于 03-05 07:32

    字符串在编程中的应用实例

    字符串在编程中有着广泛的应用,它们被用于表示文本数据、处理用户输入、构建动态内容等。以下是一些字符串在编程中的应用实例: 1. 用户输入与输出 用户输入 :程序通常需要从用户那里获取输入,这些输入通
    的头像 发表于 01-07 15:33 1129次阅读

    字符串与字符数组的区别

    在编程语言中,字符串和字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示
    的头像 发表于 01-07 15:29 1676次阅读

    字符串反转的实现方式

    在编程中,字符串反转是一个基础而重要的操作,它涉及到将一个字符串中的字符顺序颠倒过来。这个操作在多种编程语言中都有不同的实现方式,本文将探讨几种常见的字符串反转
    的头像 发表于 01-07 15:27 1243次阅读

    字符串处理方法 字符串转数字的实现

    在编程中,将字符串转换为数字是一个常见的需求。不同的编程语言有不同的方法来实现这一功能。以下是一些常见编程语言中的字符串转数字的实现方法Pyth
    的头像 发表于 01-07 15:26 1399次阅读

    LH8-E16-A1G接近开关在电路图中用什么表示

    接近开关在电路图中用特定的图形符号和文字符号来表示,这些符号用于在电路图中直观地表示接近开关的位置、连接方式和特性参数等信息。
    的头像 发表于 12-23 09:44 1637次阅读

    村田贴片电容的电压表示方法

    村田贴片电容的电压表示方法主要通过其编码系统来体现。每个村田贴片电容都有一个独特的编码,其中包含了关于电容的多种信息,包括其额定电压。以下是村田贴片电容电压表示方法的详细说明: 编码结
    的头像 发表于 12-16 14:37 1026次阅读
    村田贴片电容的电压<b class='flag-5'>表示</b><b class='flag-5'>方法</b>

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-

    就是输出一个提示信息,等待用户按下ESC键后退出程序。 首先,为了程序美观,我们定义变量a为一个转义字符\"\\033\"。这个字符是ASCII码中的转义
    发表于 12-09 09:59

    飞凌嵌入式ElfBoard ELF 1板卡-提示程序之提示脚本continue.sh

    就是输出一个提示信息,等待用户按下ESC键后退出程序。首先,为了程序美观,我们定义变量a为一个转义字符\"\\033\"。这个字符是ASCII码中的转义
    发表于 12-07 08:52