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中append()与extend()用法分享
Mar 24 Python
python字典的常用操作方法小结
May 16 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
python运行其他程序的实现方法
Jul 14 Python
python将字典内容存入mysql实例代码
Jan 18 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
Python中Unittest框架的具体使用
Aug 27 Python
python [:3] 实现提取数组中的数
Nov 27 Python
详解python tcp编程
Aug 24 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
php类自动加载器实现方法
2015/07/28 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
python版本的读写锁操作方法
2016/04/25 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python自动化生成IOS的图标
2018/11/13 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Python如何实现爬取B站视频
2020/05/20 Python
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
单位消防安全制度
2014/01/12 职场文书
主题婚礼策划方案
2014/02/10 职场文书
实验室的标语
2014/06/20 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android