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编写Linux系统守护进程实例
Feb 03 Python
Python中encode()方法的使用简介
May 18 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
Python hashlib常见摘要算法详解
Jan 13 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
python 调用js的四种方式
Apr 11 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
坏狼的PHP学习教程之第2天
2008/06/15 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
Python使用Supervisor来管理进程的方法
2015/05/28 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
使用python绘制温度变化雷达图
2019/10/18 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
实习自我鉴定模板
2013/09/28 职场文书
成品仓管员工作职责
2013/12/29 职场文书
教师个人的自我评价分享
2014/01/02 职场文书
外贸业务员工作职责
2014/01/06 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python