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 11 Python
python 实现在txt指定行追加文本的方法
Apr 29 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
Python读取stdin方法实例
May 24 Python
Python动态语言与鸭子类型详解
Jul 01 Python
python BlockingScheduler定时任务及其他方式的实现
Sep 19 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
php Mysql日期和时间函数集合
2007/11/16 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
django项目搭建与Session使用详解
2018/10/10 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Python request操作步骤及代码实例
2020/04/13 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
车间统计员岗位职责
2014/01/05 职场文书
高三生物教学反思
2014/01/25 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
自主招生专家推荐信
2015/03/26 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫