当前位置: 首页 > 科技观察

Python秀技:五个Python转义符号

时间:2023-03-16 10:35:32 科技观察

大家好,我是明哥。这篇文章昨天其实已经发在今日头条上了,但是因为很久之前写的很匆忙,发之前没有仔细检查内容,所以有些内容出现了一些问题,这也是正常的,谁写的代码没点bug,文章大同小异。但我还是怕误导一些读者,所以我立即删除了这篇文章。下班回到家后,我立即认真校对稿件,修改了一些错误的内容,同时又增加了很多新的内容。与昨天的版本相比,更加系统化了。相信对于很多同学来说,哪怕是很不起眼的越狱,这篇文章也能学到不少东西。好吧,这是文章的正文。1、为什么会有逃生?ASCII表中有128个字符。有我们非常熟悉的字母、数字、标点符号,都可以从我们的键盘输出。此外,还有一些我通常很难在键盘上找到的非常特殊的字符,例如制表符和铃铛。为了能够将那些特殊字符写入字符串变量,指定了一个字符\进行转义。使用此字符,您在字符串中看到的字符可能不一定会打印出来。我看到了。比如>>>msg="hello\013world\013hello\013python">>>print(msg)helloworldhellopython>>>是不是有点神奇?它变成了阶梯状的输出。\013是什么意思?\是转义符号。上面说过,013是ASCII编码的八进制表示。注意前面是0,不能省略,不能省略字母o。将八进制的13转成十进制后,查一下ASCII码表为11。11对应的是一个垂直定位符号,这就可以解释为什么它是步进式输出字符串了。2、ASCII在转义的5种表示中共有128个字符。如果用八进制表示,至少需要三位数字才能全部表示。这就是为什么不能省略上面第一个0的原因。就算现在不用了,我也得留着空着。而如果使用十六进制,只要有两位数字,就代表所有的ASCII字符。同时,为了避免与八进制混淆,\后必须加英文字母x表示十六进制,后面跟着两位十六进制值。\以0-7三位数字开头,表示八进制\x以0-f两位数字开头,表示十六进制。因此,当我定义一个字符串值为hello+回车+world时,有多种方法:#第一种方法:octal>>>msg="hello\012world">>>print(msg)helloworld>>>#第二种方法:十六进制>>>msg="hello\x0aworld">>>print(msg)helloworld>>>通常我们很难记住一个字符的ASCII码。即使我们记住了,我们也必须将它转换成八进制或十六进制。太难了。因此,对于一些常用的和特殊的字符,我们习惯于使用另一种类别名的方法,比如用\n来表示一个换行符,相当于\012和\x0a。类似的表示法,还有以下。所以,要实现hello+回车+world,还有第三种方法#第三种方法:使用类似于alias的方法>>>msg="hello\nworld">>>print(msg)helloworld>>>Sofar,我们掌握了三个转义表达式。已经很难得了,脑洞大点的,再介绍两个。ASCII码表所能表示的字符太有限了。如果你想打印一个汉字,对不起,你必须使用Unicode代码。Unicode编码由4个16进制值组成>>>print("\u4E2D")里面有什么?为什么我知道里面的unicode是\u4E2D呢?就这样打印吧#Python2.7>>>a=u"中">>>au'\u4e2d'所以要实现hello+回车+world,还有第四种方法。#第四种方法:使用unicode,\u000a表示换行>>>print('hello\u000aworld')helloworld看到这里,是不是觉得结束了呢?还没有。下面还有一个。其实Unicode编码也可以由8个32进制数组成。为了和前面的区别,这里以\U开头。#第五种方法:使用unicode,\U0000000A表示换行>>>print('hello\U0000000Aworld')helloworld好了,至此我们已经掌握了五个转义表达式。总结一下:\以0-7开头,后跟三位数字(八进制)---可以表示所有ASCII字符\x以0-f开头,后跟两位数(十六进制)---可以表示所有ASCII字符\u以四位0-f(十六进制)的值开头的字符---可以表示所有Unicode字符\U以八位0-f(三十进制)的值开头---可以表示allUnicodecharacters\开头,后面跟着除x、u、U以外的特定字符---只能表示部分字符。为什么标题说逃跑也能显身手?试想一下,如果你的同事在打印日志的时候,使用了这种unicode编码,然后你在定位问题的时候用这个关键字去搜索,却发现什么也找不到?这是一个成功。虽然这种行为真的很sb,但在某些人看来可能是很厉害的操作吧?五种转义符号介绍到这里,更多转义相关的内容也将陆续介绍。很有意思的内容,有兴趣的可以继续看下去。3.Rawstring当字符串中有转义字符时,我们使用print打印后,一般情况下,输出的并不是我们在字符串中看到的。那么如果我们需要输出hello\nworld,如果我们不希望Python将\n转义成换行符怎么办?这种情况下,可以在定义的时候将字符串定义为原始字符串,只需要在字符串前面加一个r或者R就行了。>>>print(r"hello\nworld")hello\nworld>>>>>>>print(R"hello\nworld")hello\nworld但是,r不能一直加,比如当你的string时它是某个程序/函数返回给你的,不是你自己生成的#假设这是国外数据,返回"hello\nworld">>>body=spider()>>>print(body)helloworld此时打印它,\n是换行打印。4、使用repr针对上面r不能使用的情况,可以尝试repr来解决这个需求:>>>body=repr(spider())>>>print(body)'hello\nworld'通过repr函数经过处理,为了让打印出来的结果接近字符串本身的样子,实际上做了两件事,把\改成\\,在字符串的开头和结尾加上'或者"你可以把变量打回去PythonShellCar,就可以看出端倪了,要不要在开头和结尾加'或者",要看你原来的字符串。>>>body="你好\nworld">>>repr(body)"'你好\\nworld'">>>>>>>>>>body='你好\nworld'>>>repr(body)"'你好\\n世界'"5。使用string_escape如果您仍在使用Python2,实际上还有另一种方法可以做到。那就是使用string.encode('string_escape')的方法,同样可以达到repr>>>"hello\nworld".encode('string_escape')'hello\\nworld'>>>6的效果。查看原始字符综上所述,查看原始字符串有两种方式:如果是PythonShell交互模式,则打变量回车;如果不是PythonShell交互模式,可以先用repr处理,然后用print打印>>>body="hello\nworld">>>>>>body'hello\nworld'>>>>>>print(repr(body))'你好\nworld'>>>7.恢复转义:转为原字符串有没有什么办法可以把经过repr处理或者\\未转义的字符串返回,变成原来的转义字符串呢?答案是:是的。如果你使用Python2,你可以这样做:>>>body="hello\\nworld">>>>>>body'hello\\nworld'>>>>>>body.decode('string_escape')'hello\nworld'>>>如果你使用Python3,你可以这样做:>>>body="hello\\nworld">>>>>>body'hello\\nworld'>>>>>>bytes(body,"utf-8").decode("unicode_escape")'你好\nworld'>>>什么?还要区分Python2和Python3?太多麻烦了。明哥教你使用兼容Python2和Python3的写法。首先在Python2中输出>>>importcodecs>>>body="hello\\nworld">>>>>>codecs.decode(body,'unicode_escape')u'hello\nworld'>>>然后看看Python3中的输出>>>importcodecs>>>body="hello\\nworld">>>>>>codecs.decode(body,'unicode_escape')'hello\nworld'>>>可以看到Python2有一个u,Python3的输出没有,但无论如何它们都是未转义的。以上就是小编为大家整理的关于Python转义的全部内容。在整理的过程中,不断发现新的知识,在帮助大家的同时,也对逃逸的一些内容有了更深的理解。也是无意中整理出了转义的五种表现形式,所以这篇文章才勉强被我收录到Python秀技操作系列中。您可以点击下方链接查看本系列文章。本文转载自微信公众号《Python编程时间》,可通过以下二维码关注。转载本文请联系Python编程时间公众号。