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来编写HTTP服务器的超级指南
Feb 18 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
使用Python横向合并excel文件的实例
Dec 11 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
微信小程序python用户认证的实现
Jul 29 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
Python二次规划和线性规划使用实例
Dec 09 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
基于python实现上传文件到OSS代码实例
May 09 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
python 装饰器重要在哪
Feb 14 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
详解Python之unittest单元测试代码
2018/01/24 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电