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

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

python的正则表达式中需要转义的元字符有以下几个:
.
^
$
*
+
?
\
[]
|
{}
()
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]
#>>> []

python正则 re模块 字符串转义相关推荐

  1. python 正则之提取字符串中的汉字,数字,字母

    python 正则之提取字符串中的汉字,数字,字母 #\d 匹配一个数字字符.等价于 [0-9] #\D 匹配一个非数字字符.等价于 [^0-9]#过滤字符串中的英文与符号,保留汉字 import r ...

  2. Python正则re模块详解

    Cooking Regex微信公众号 正则表达式学习 目录 re.match re.fullmatch re.search re.sub re.subn re.split re.findall re. ...

  3. python 正则 匹配任意字符串_python中正则匹配

    写代码时候,不管是爬虫,还是获取某些特定的资源,我们需要写正则表达式. 因为不常用,有些语法生疏.有时明明觉得自己的语法可以,可就是不行. 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之 ...

  4. Python正则re模块学习笔记

    微信公众号:运维开发故事,作者:wanger re正则处理 正则定义 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串&qu ...

  5. python 正则re模块

    re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood is a handsome boy, he ...

  6. Python 正则re模块之findall()详解

    1. 先说一下findall()函数的两种表示形式 import re kk = re.compile(r'\d+') kk.findall('one1two2three3four4') #[1,2, ...

  7. python 正则 匹配任意字符串_Python正则表达式匹配字符串中的任意纯数字

    1.使用"\d+"匹配全数字 代码: import re zen = "Arizona 479, 501, 870. Carlifornia 209, 213, 650. ...

  8. python 正则 去除字符串中异常字符

    import re simple_punctuation = '['!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}~,.,]' p1='帮会建了徽信群 ...

  9. python 正则匹配任意字符串(包括换行符,空白等)--主用于文本

    import re lll="[订单]\nsndnum=27\n1=|消息类型|35|D|MSGTYPE|\n2=|委托合同号|11|6000|\n3=|证券代码|55|600600|\n4 ...

最新文章

  1. java利用opencv降维_opencv中PCA降维
  2. AbstractQueuedSynchronizer源码解析
  3. MySQL的一些概念笔记
  4. asp.netcore3.0 使用 DbProviderFactories 连接数据库
  5. 【Java】关于Java中的各种流
  6. flash as3与后台php交互用户注册例子,as3与PHP后台交互2
  7. 安装mysql最后一步第二个打叉_Mysql安装到最后一步时。出现start service红叉   亲朋好友帮忙指导一下!谢谢! 百...
  8. Educational Codeforces Round 67
  9. 软件测试的艺术读书笔记
  10. 数字信号上下采样对频谱影响,以及如何添加相应滤波器
  11. USB协议详解第1讲(核心概念通俗理解)
  12. 中国雅虎殒身记:当初说好的独立上市呢?
  13. 解决硬盘打不开的问题
  14. vue3后台管理系统(https://github.com/noob-Jp/my-admin-vue3)
  15. 在命令提示符 “CMD” 中打印输出时间
  16. 微信小程序实现添加银行卡,银行卡号每隔四位插入空格并展示时仅显示前后四位,或者仅显示后四位(超详细)
  17. mysql约束简单理解
  18. java点餐系统实验报告_JAVA课程实践报告 基于web的点餐系统毕业设计.doc
  19. Iso中查看Windows版本
  20. QT QChartView 鼠标随动 十字线 缩放 平移 拖动

热门文章

  1. LINUX做软raid
  2. c语言校验mac函数,C语言验证MAC地址字符串合法性函数
  3. 苹果手机位置共享后没开启定位服务器,iPhone默认开启但无卵用的设置开着干嘛?难怪手机这么耗电...
  4. Lie群、Lie代数
  5. 设计模式二:建造者模式
  6. 192Echarts - 自定义系列(Custom Calendar Icon)
  7. 51Nod 1417 天堂里的游戏
  8. 回文数c语言 字符串,回文数与回文字符串的判断
  9. 【iMessage苹果推群发】软件安装利用dropbox分享外链进行访问原始文件
  10. 智能语音机器人市场对手如此多,微服网络如何更胜一筹