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实现连接mongodb的方法
May 08 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Odoo中如何生成唯一不重复的序列号详解
Feb 10 Python
详解Django rest_framework实现RESTful API
May 24 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
解决python Markdown模块乱码的问题
Feb 14 Python
python3实现表白神器
Apr 09 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
Python如何计算语句执行时间
Nov 22 Python
使用python去除图片白色像素的实例
Dec 12 Python
python3中sys.argv的实例用法
Apr 24 Python
python使用建议与技巧分享(一)
Aug 17 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
详解Python的循环结构知识点
2019/05/20 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
竞选班干部演讲稿500字
2014/08/20 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
公司安全管理制度范本
2015/08/05 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python