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

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

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

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

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

  1. # 普通元字符的转义
  2. _string = '''
  3. !@#$%^&
  4. '''
  5.  
  6. # 不转义
  7. print re.findall('$', _string)
  8. #>>> ['', '']
  9.  
  10. # 双反斜杠转义
  11. print re.findall('\\$', _string)
  12. #>>> ['$']
  13.  
  14. # 单反斜杠转义
  15. print re.findall('\$', _string)
  16. #>>> ['$']

看上面的例子大家可能会发现,使用一个反斜杠 \ 也可以达到转义的效果,那为什么还要写两个呢?这得先搞清楚python

的字符串转义(不是正则表达式转义),python本身使用 \ 来转义一些特殊字符,比如在字符串中加入引号的时候,为了

  1. s = 'i\'m superman'
  2. print s
  3. #>>> i'm superman

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

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

  1. # 错误写法
  2. # print '\'
  3.  
  4. # 正确写法
  5. print '\\'
  6. #>>> \
  7.  
  8. # 原生字符串
  9. print r'\\'
  10. #>>> \\

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

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

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

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

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

误。具体可以参考http://t.cn/RfolM3H

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

  1. _string = '\\\\'
  2. print _string
  3. #>>> \\
  4.  
  5. # 字符串
  6. for i in re.findall('\\\\', _string):
  7. print i
  8. #>>> \
  9. #>>> \
  10.  
  11. # 原生字符串
  12. for i in re.findall(r'\\', _string):
  13. print i
  14. #>>> \
  15. #>>> \

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

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

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

    1. 首先正则表达式是一个python的字符串
    2. 字符串本身会先进行转义处理
    3. 正则表达式引擎得到处理之后的字符串后再对字符串进行正则表达式引擎自己的处理
    4. 开始匹配
  1. # 字符串
  2. # '\\\\'
  3.  
  4. # 经过python处理之后
  5. # '\\'
  6.  
  7. # 正则表达式引擎接收到的
  8. # '\\'
  9.  
  10. # 正则表达式引擎进行转义处理后 可以匹配到 \
  11. # '\'

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

  1. # 原生
  2. # '\\'
  3.  
  4. # 不再处理
  5. # '\\'
  6.  
  7. # 正则表达式引擎接收到的
  8. # '\\'
  9.  
  10. # 正则表达式引擎进行转义处理
  11. # '\' 

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

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

  1. # 原生
  2. # '\$'
  3.  
  4. # 识别不了 不进行处理
  5. # '\$'
  6.  
  7. # 正则表达式引擎接收到的
  8. # '\$'
  9.  
  10. # 正则表达式引擎进行转义处理
  11. # '$'

  下面举几个例子看一下

  1. # 匹配 \d+
  2. _string = 'i am \d+'
  3.  
  4. print re.findall('\\\\d\\+', _string)[0]
  5. #>>> \d+
  6.  
  7. print re.findall(r'\\d\+', _string)[0]
  8. #>>> \d+
  9.  
  10. # 匹配 []
  11. _string = 'i am []'
  12.  
  13. print re.findall('\\[\\]', _string)[0]
  14. #>>> []
  15.  
  16. print re.findall('\[\]', _string)[0]
  17. #>>> []
  18.  
  19. print re.findall(r'\[\]', _string)[0]
  20. #>>> []

python正则表达式转义注意事项的更多相关文章

  1. 第11.15节 Python正则表达式转义符定义的特殊序列

    一. 引言 在前面<第11.13节 Python正则表达式的转义符"\"功能介绍>介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自 ...

  2. Python正则表达式\W+和\W*匹配过程的深入分析

    在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致: >>> re.split('\W*','Hello,world') ['', 'H', 'e', ...

  3. 第11.14节 正则表达式转义符和Python转义符相同引发问题的解决办法

    正则表达式使用反斜杠('\')来把特殊字符转义成普通字符(为了方便称为"正则表达式转义"),而反斜杠在普通的 Python 字符串里也是转义符(称为"字符串转义" ...

  4. 第11.13节 Python正则表达式的转义符”\”功能介绍

    为了支持特殊元字符在特定场景下能表示自身而不会被当成元字符进行匹配出来,可以通过字符集或转义符表示方法来表示,字符集表示方法前面在<第11.4节 Python正则表达式搜索字符集匹配功能及元字符 ...

  5. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  6. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  7. 比较详细Python正则表达式操作指南(re使用)

    比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...

  8. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  9. Python 正则表达式-OK

    Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...

随机推荐

  1. MPP、SMP、NUMA概念介绍

    一.MPP,SMP,NUMA概念介绍 1.1.       MPP架构介绍 MPP (Massively Parallel Processing),大规模并行处理系统,这样的系统是由许多松耦合的处理单 ...

  2. 求数组中的逆序对的数量----剑指offer36题

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...

  3. oracle老是出现监听错误

    解决方法之一: 点击开始-->选择程序--->选中你安装的oracle版本-->选中配置与移植工具-->选中Net Configuration Assistant-->在 ...

  4. struts2的运行流程

    流程: 1:url 提交到tomcat http://localhost/s2/firstAction 2:tomcat 根据工程名 去 webapps 文件夹下找到对应工程 3:找web.xml S ...

  5. 吴裕雄 实战PYTHON编程(8)

    import pandas as pd df = pd.DataFrame( {"林大明":[65,92,78,83,70], "陈聪明":[90,72,76, ...

  6. Linux下php5.3.3安装mcrypt扩展

    具体操作: 一.下载软件包 1.下载php(版本要与系统安装的一致) http://pan.baidu.com/s/1mifTbfE 2.下载libmcrypt(安装mcrypt需要此软件包) htt ...

  7. CentOS 7安装配置Redis数据库

    Redis源码获取 1.进入Redis官网获取Redis最新稳定版下载地址 2.通过wget命令下载 Redis 源代码.   Redis编译 1.通过tar -xvf redis-3.0.2.tar ...

  8. Spring WebMVC 4.1返回json时 406(Not Acceptable)

    1.问题现象Tomcat7+Spring4.1.4,返回json字符串时发生406错误 The resource identified by this request is only capable ...

  9. js base64转二进制

    base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...

  10. SpringMVC中ApplicationContext中的配置文件的问题(No bean named 'sessionFactory' is defined 已解决)

    在一个SpringMVC项目中, 连着两天不管怎么搞都是一直在报错, 报的最多的就是一个 Servlet.service() for servlet [springDispatcherServlet] ...