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实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
Python多线程编程简单介绍
Apr 13 Python
使用Python编写vim插件的简单示例
Apr 17 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
NumPy统计函数的实现方法
Jan 21 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
python开发入门——set的使用
Sep 03 Python
python用Configobj模块读取配置文件
Sep 26 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 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面向对象概念
2011/11/06 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python模拟登陆实现代码
2017/06/14 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
详解Python是如何实现issubclass的
2019/07/24 Python
python热力图实现简单方法
2021/01/29 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
软件测试工程师笔试题带答案
2015/03/27 面试题
房屋公证委托书
2014/04/03 职场文书
成绩单评语
2015/01/04 职场文书
2015年工程部工作总结
2015/04/30 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
SQL SERVER触发器详解
2022/02/24 SQL Server
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏