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里将list中元素依次向前移动一位
Sep 12 Python
python复制与引用用法分析
Apr 08 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python基础之函数的定义与使用示例
Mar 23 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
通过案例解析python鸭子类型相关原理
Oct 10 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
小程序实现多列选择器
2019/02/15 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
python 写的一个爬虫程序源码
2016/02/28 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
python通过http下载文件的方法详解
2019/07/26 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
医院辞职信范文
2014/01/17 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
情人节单身感言
2015/08/03 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL