首页 > 编程语言 >Python - 正则表达式转义注意事项

Python - 正则表达式转义注意事项

时间:2024-10-14 15:25:06浏览次数:1  
标签:string Python 转义 正则表达式 字符串 print findall

无论哪种语言,在使用正则表达式的时候都避免不了一个问题,就是在匹配元字符的时候,需要对元字符进行转义,让

正则表达式引擎将其当做普通字符来匹配。本文主要以python为例,说明一下转义中需要注意的问题。

python的正则表达式中需要转义的元字符有以下几个:

  1. .
  2. ^
  3. $
  4. *
  5. +
  6. ?
  7. \\
  8. []
  9. |
  10. {}
  11. ()

python中对元字符的转义使用双反斜杠 \\ 来表示

# 普通元字符的转义
_string = '''
!@#$%^&
'''

# 不转义
print re.findall('$', _string)
#>>> ['', '']

# 双反斜杠转义
print re.findall('\\$', _string)
#>>> ['$']

# 单反斜杠转义
print re.findall('\$', _string)
#>>> ['$']

看上面的例子大家可能会发现,使用一个反斜杠 \ 也可以达到转义的效果,那为什么还要写两个呢?这得先搞清楚python的字符串转义(不是正则表达式转义),python本身使用 \ 来转义一些特殊字符,比如在字符串中加入引号的时候,为了

s = 'i\'m superman'
print s
#>>> i'm superman

防止和字符串本身的引号冲突,使用 \ 来转义,一般情况下这个也不会引起什么问题,但是当你要使用 \ 来转义 \ 的时候,

就比较混乱了,比如我们想要输出一个 \ ,得写两个 \ ,否则会报语法错误,因为 \ 把后面的引号给转义了,必须使用 \ 

# 错误写法
# print '\'

# 正确写法
print '\\'
#>>> \

# 原生字符串
print r'\\'
#>>> \\

将 \ 转义一下使其不具备转义功能,才可以正确输出,当使用原生字符串的时候,输出显示了两个 \ ,看起来好像是写几个

输出几个的样子,如果这样想的话,你可以试一下,看能不能输出奇数个 \。

 

 

先来说一下什么是原生字符串,其实就是不进行特殊处理的字符串,所谓特殊处理,貌似就是针对转义的,原生字符串

的诞生本身就是为了解决转义的时候写了太多 \ 的问题,但是为什么使用了原生字符串仍然不能只输出一个 \ 呢?其实这应

该算是一个bug,就是python的字符串不能以奇数个 \ 结尾,这样的写法会被认为是将结尾的引号进行了转义,导致语法错

误。

虽然原生字符串并不是很完美,但它已经可以帮我们解决很大一部分问题了。比如当你想匹配 \ 的时候,原生字符串可

_string = '\\\\'
print _string
#>>> \\

# 字符串
for i in re.findall('\\\\', _string):
    print i
#>>> \
#>>> \

# 原生字符串
for i in re.findall(r'\\', _string):
    print i
#>>> \
#>>> \

以让你少写一半的 \ ,既节省代码量,又增加可读性。

 

 

说了这么多也没说为什么在写正则表达式的时候一个 \ 也可以起到转义的作用。我们先来分析一下一个字符串被正则表

达式引擎解析的过程,一共有4步:

    1. 首先正则表达式是一个python的字符串
    2. 字符串本身会先进行转义处理
    3. 正则表达式引擎得到处理之后的字符串后再对字符串进行正则表达式引擎自己的处理
    4. 开始匹配
# 字符串
# '\\\\'

# 经过python处理之后
# '\\'

# 正则表达式引擎接收到的
# '\\'

# 正则表达式引擎进行转义处理后 可以匹配到 \
# '\'

而当使用原生字符串的时候就变为了3步

# 原生
# '\\'

# 不再处理
# '\\'

# 正则表达式引擎接收到的
# '\\'

# 正则表达式引擎进行转义处理
# '\'

下面是最重要的一个,当使用一个 \ 转义的时候,python会识别不了转义序列,于是它就不做任何处理,直接传给了

正则表达式引擎。这就解释了为什么一个 \也可以转义。这个不算bug,虽然方便了使用,但会让人很迷惑,有利有弊吧。

# 原生
# '\$'

# 识别不了 不进行处理
# '\$'

# 正则表达式引擎接收到的
# '\$'

# 正则表达式引擎进行转义处理
# '$'

 

下面举几个例子看一下

# 匹配 \d+
_string = 'i am \d+'

print re.findall('\\\\d\\+', _string)[0]
#>>> \d+

print re.findall(r'\\d\+', _string)[0]
#>>> \d+


# 匹配 []
_string = 'i am []'

print re.findall('\\[\\]', _string)[0]
#>>> []

print re.findall('\[\]', _string)[0]
#>>> []

print re.findall(r'\[\]', _string)[0]
#>>> []

 

标签:string,Python,转义,正则表达式,字符串,print,findall
From: https://www.cnblogs.com/xiaolintongxue1/p/18464280

相关文章

  • 38个Python游戏开发库
    1PyGame官网:https://www.pygame.org/docs/概述:Pygame是一组专为编写视频游戏而设计的Python模块。它在优秀的SDL库之上添加了功能。这允许您使用python语言创建功能齐全的游戏和多媒体程序。Pygame具有高度的可移植性,可以在几乎所有平台和操作系统上运行。拓展:对Py......
  • 32个Python图形化界面库
    1wxPython官网:https://wxpython.org/pages/overview/ 概述:wxPython是一个用C++编写的适用于Python的跨平台GUI工具包,它让Python程序员们能够简单、轻松地创建功能强大的图形用户界面的程序。它目前支持的平台包括MicrosoftWindows、MacOSX和macOS,以及Linux或其他具有GT......
  • 【python爬虫案例】利用python爬取B站TOP100热门排行榜附源码
    目录一、爬取目标-B站排行榜二、B站排行榜网站分析三、B站排行榜爬虫代码详解四、B站排行榜结果五、python爬虫源代码获取一、爬取目标-B站排行榜大家好,我是老王!今天给大家分享一期python爬虫案例,这次爬取的对象是:B站热门排行榜数据爬取的目标网址是:https://www.bil......
  • Java与Python的角斗 动画动漫下载 猫和老鼠 爆笑虫子 微观小世界 及时保存以防失效
    在“代码王国”的金色大厅内,一场前所未有的角斗即将拉开序幕。大厅四周镶嵌着由各种算法构成的璀璨宝石,每一颗都闪烁着智慧的光芒,映照着即将上演的较量。爆笑虫子第一季104集合集 第一季1-104.mp4https://www.alipan.com/s/4nLKc6NWdG7提取码:12or点击链接保存,或者复制......
  • python中多线程和多进程的区别
    希望在1分钟内完成500架无人机的路径规划任务,而目前A*算法在50架无人机的情况下需要10秒,意味着在不做优化的情况下处理500架无人机将需要大约100秒,超出你的指标要求。提升计算速度是关键。多线程和多进程是常用的加速方案,但它们在Python中的效果存在差异1、多线程Python的标准......
  • python3 log工具
    python3log工具logutil.py#-*-coding:utf-8-*-importos,sys,tracebackimportloggingfromlogging.handlersimportRotatingFileHandlerimportgetpassdefsingleton(cls):instances={}defget_instance():ifclsnotininstances:......
  • 10.Python 对象(封装、继承、多态、类型注解)
    一、初始对象在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的在程序中设计表格,称之为设计类(class)classStudent:name:None在程序中打印生产表格,称之为创建对象stu1=Student()stu2=Student()在程序中填写表格,称之为对象属性赋值......
  • 基于yolov10的PCB板缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python
    更多目标检测和图像分类识别项目可看我主页其他文章功能演示:yolov10,PCB板缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的PCB板缺陷检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模型......
  • python中global关键字的作用
    python中global关键字的作用python中初始化一个变量y_axis_RA=[]一个函数中给y_axis_RA赋值,但是该变量显示未使用,在另外一个函数中使用y_axis_RA提示变量为空在Python中,变量作用域的问题可能会导致你遇到的情况。如果你在函数外部初始化了一个变量y_axis_RA=[],然后在函数......
  • 基于python+flask框架的影片个性化推荐系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的广泛应用,影视娱乐已成为人们日常生活中不可或缺的一部分。在海量影片资源面前,用户往往难以快速找到符合......