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做减法操作介绍
Jan 09 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python进阶篇之字典操作总结
Nov 16 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python实现的文轩网爬虫完整示例
May 16 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
python中PyQuery库用法分享
Jan 15 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冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python求前n个阶乘的和实例
2020/04/02 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
市优秀教师事迹材料
2014/02/05 职场文书
绿色出行口号
2014/06/18 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
退学证明范本3篇
2014/10/29 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android