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 相关文章推荐
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
对django layer弹窗组件的使用详解
Aug 31 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
django 读取图片到页面实例
Mar 27 Python
Python:__eq__和__str__函数的使用示例
Sep 26 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
python读写数据读写csv文件(pandas用法)
Dec 14 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翻页类
2009/06/01 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
Node.js创建Web、TCP服务器
2017/12/05 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Python pymongo模块用法示例
2018/03/31 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python 音频生成器的实现示例
2019/12/24 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
2015年父亲节寄语
2015/03/23 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
红色革命电影观后感
2015/06/18 职场文书
信息技术研修心得体会
2016/01/08 职场文书
初中体育课教学反思
2016/02/16 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python