Python字符串和正则表达式中的反斜杠('\')问题详解


Posted in Python onSeptember 03, 2019

在Python普通字符串中

在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如

In [1]: print('abc\ndef') # '\n'具有换行的作用
abc
defg

In [2]: print('abc\tdef') # '\t'具有制位符的作用           
abc  defg

我们还可以用'\'来转义特殊字符,使其成为普通字符,比如

In [3]: print('abc\\tdef') # 使'\'成为一个普通的字符,没有转义作用
abc\tdef

In [4]: print('abc\'tdef') # 使'''成为一个普通的字符,不再需要和另一半单引号'''配对              
abc'tde

所以,在python普通字符串中,我们不能以奇数个'\'结尾,这样会导致结束的的引号转义成一个纯字符,从而使得这段字符串没有引号来结束。

在Python原生字符串中

我们在字符串前加一个'r'来表示原生字符串,比如r'abc'。原生字符串中的特殊字符的特殊含义将会被剥夺掉,如下

In [5]: print(r'abc\ndefg') # '\n'没有换行的作用,仅仅是一个普通的字符串             
abc\ndefg

In [6]: print(r'abc\tdefg') # '\t'没有制位符的作用,仅仅是一个普通的字符串          
abc\tdef

这里有一个奇怪的问题,在原生字符串中,虽然'\'成为了一个普通的字符串,但我们同样不能以奇数个'\'字符串结尾,这是因为Python正则表达式的原因,在正则表达式中我们将会解释这个问题。

在Python(regular express)正则表达式中

Python正则表达式中会有一些不同,正则表达式中指定了一些元字符(metacharacter),如下

. ^ $ * + ? { } [ ] \ | ( )

它们都具有特殊的含义,'\'也属于元字符。'\'既属于Python中的特殊字符,也属于正则中的元字符,所以使用时得非常小心。那么在正则中,'\'的作用是什么呢?我们看一个例子

In [7]: re.search('.', 'sd.f')               
Out[7]: <_sre.SRE_Match object; span=(0, 1), match='s'>

In [8]: re.search('\.', 'sd.f')              
Out[8]: <_sre.SRE_Match object; span=(2, 3), match='.'>In [9]: re.search('\n', 'sdfd\nfds')            Out[9]: <_sre.SRE_Match object; span=(4, 5), match='\n'>

"""
'.'作为一个元字符,它的特殊含义是匹配任意一个字符,而当我们在其前面加'\'后,它的特殊含义消失了,匹配到的是'.';而且'\'依然可以把Python中某些字符转义成特殊字符。
"""

所以,'\'的作用是剥夺元字符的特殊含义,使其成为一个Python字符,所以它还是会具有在Python普通字符串中的转义作用,比如'\n'依然表示换行。所以,'\'既是正则中的一个元字符,又是Python中的一个特殊字符。那么我们该如何匹配到纯字符'\'(无任何特殊意义)?

在正则中,'\'的作用是把元字符转义成Python字符串文字(a Python string literal),所以正则中的'\\'其实是其实是Python字符中的'\',它仍然还具有转义作用,所以在正则中我们还得对每个'\'再进行转义一次,即'\\\\',这样就可以匹配到纯字符'\'了。看下面例子

In [10]: re.search('\\\\', 'fsd\nfds') # 目标字符串中没有纯字符'\',所以匹配为空

In [11]: re.search('\\\\', 'fsd\\nfds')                     
Out[11]: <_sre.SRE_Match object; span=(3, 4), match='\\'> # Python字符串中,'\\'就是纯字符'\'

在re中反复的使用'\',这可能会生成大量的连续的反斜杠,从而导致某些字符串难以理解。解决的办法是用Python原生字符串来书写正则表达式,如下

In [12]: re.search(r'\\', 'fsd\\nfds') # 两个'\\'就可以匹配到纯字符'\'
Out[12]: <_sre.SRE_Match object; span=(3, 4), match='\\'>

另外,当我们用原生字符串来书写正则表达式时,Python字符中的特殊字符依然有效,比如

In [13]: re.search(r'\n', 'fsd\nfds')                      
Out[13]: <_sre.SRE_Match object; span=(3, 4), match='\n'>
"""
在Python字符中,r'\n'仅仅表示纯字符串'\n',没有换行的作用;在正则中,r'\n'依然还有换行的作用。所以此时我们不能用奇数个'\'来结尾某个正则表达式,这样导致结束的引号被转义成一个纯字符,无结束符号。所以,在Python原生字符串中,我们也同样规定不能用奇数个'\'来结尾。
"""

以上就是本次介绍的全部知识点内容,感谢大家对三水点靠木的支持。

Python 相关文章推荐
python使用Berkeley DB数据库实例
Sep 26 Python
详解Python中time()方法的使用的教程
May 22 Python
Python 查看文件的编码格式方法
Dec 21 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
Python 实现一行输入多个值的方法
Apr 21 Python
Python循环结构的应用场景详解
Jul 11 Python
python之生产者消费者模型实现详解
Jul 27 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
pytorch 如何使用batch训练lstm网络
May 28 Python
Django中间件拦截未登录url实例详解
Sep 03 #Python
如何为Python终端提供持久性历史记录
Sep 03 #Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 #Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 #Python
python实现静态web服务器
Sep 03 #Python
Python的Lambda函数用法详解
Sep 03 #Python
Python获取一个用户名的组ID过程解析
Sep 03 #Python
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
destoon二次开发入门示例
2014/06/20 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php接口技术实例详解
2016/12/07 PHP
php实例化一个类的具体方法
2019/09/19 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
详解js闭包
2014/09/02 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Django异步任务线程池实现原理
2019/12/17 Python
信号生成及DFT的python实现方式
2020/02/25 Python
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
NET程序员上机面试题
2015/05/23 面试题
怎么写自荐书范文
2014/02/12 职场文书
授权委托书格式
2014/07/31 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
三八妇女节致辞
2015/07/31 职场文书
九年级英语教学反思
2016/02/15 职场文书
nginx共享内存的机制详解
2022/03/21 Servers