免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: eeeee159963
打印 上一主题 下一主题

正则表达式中的一个疑问 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-11-24 17:50 |只看该作者
  1. >>> print('2x\+5y')
  2. 2x\+5y
  3. >>> print(r'2x\+5y')
  4. 2x\+5y
复制代码
这样明白了?

论坛徽章:
0
22 [报告]
发表于 2010-11-24 20:07 |只看该作者
这样明白了?
donotblock 发表于 2010-11-24 17:50

多谢!

论坛徽章:
0
23 [报告]
发表于 2010-11-24 22:36 |只看该作者
本帖最后由 ixuh 于 2010-11-24 22:37 编辑

回复 22# eeeee159963


    我觉得你还是没有很明白呢…… - -#
我再讲一下好了

先来说一下python的字符串:
\ 是转义字符这个很清楚,比如python字符串里 \n 代表换行符,而字符串 \+ 如果+转义后有其他含义,则也仅代表一个字符。
可是转义符\ 很郁闷的发现+转义后没有意义,于是他就仅仅表示他自己的字面意思,所以python字符串 '\+'就是字面常量 \+。
原生字符串r'..'的作用是取消转义字符串里转义符 \ 的作用,所以在 r'..'里的\不是转义符,他不会去判断后面字符是否可以转义,直接表示字面上的\,所以r'\+'也是字面常量 \+。
另外,由于'\\' 表示字符 \,'\\+'也是字面常量 \+。
结论就是这个特殊的情况下这三者是相同的: '\+' == '\\+' == r'\+';而任意情况下这两者总是相同的:'\\字符' == r'\字符',如'\\n' == r'\n'

然后说一下匹配的过程:
正则引擎拿到表达式字符串后,并不是直接拿去匹配的,首先他要把python字符串表示的表达式编译成正则对象。
于是,r'\+' ('\\+') 经过编译以后,变成匹配字面上的+。

在这个case里,实际上是python先把'\+'变成了'\\+',然后才交给正则引擎的。正则引擎只认识r'\+'是匹配字面+。
举个例子很容易证明这一点,比如一个包含了引用第一个分组 \1 的正则表达式。
如果你写成'\1',python会认为这是一个特殊的字符,而不再会把他变成'\\1';正则里'\1'仅仅能匹配文本里的'\1',无法引用分组。
这种情况,必须写成r'\1'才行。
所以推荐是正则里无论什么时候都使用原生字符串,比较不容易出错。

这么说会不会好理解一些呢 - -#

最主要的是要理解 python字符串 是字面量 的一种载体,正则接受的是字面量然后编译成正则对象,只是在python里,字面量只能用python字符串表示而已:
需要匹配字符+时,正则引擎需要字面量 \+,python字符串可以使用'\+'  r'\+' '\\+'来表示字面量 \+;
需要引用分组1时,正则引擎需要字面量 \1,python字符串只能使用 r'\1'  '\\1' 来表示字面量\1,因为python字符串的'\1'代表了一个特殊的字符。

把python和正则分开看。正则表达式不是python的一部分。事实上,正则是另一种用于匹配文本的语言。
正则引擎接受的不是python字符串,而是字面量。只是在python语言里,字面量由python字符串表示。
推荐正则里无论什么时候都使用原生字符串,因为原生字符串的写法最接近字面量,最不容易出错。

论坛徽章:
0
24 [报告]
发表于 2010-11-25 09:52 |只看该作者
这种问题也会上首页?莫名其妙

不过既然上了首页,好歹说两句。
  1. In [3]: r"2x\+5y" ==  "2x\+5y"
  2. Out[3]: True
复制代码
这个问题的本质不是正则表达式,而是Py的raw string.

长话短说,这个\的意思是,看后面那个字符。如果后面那个字符加上反斜杠之后,有了特殊的意思,则这个反斜杠就和后面那个字符合并起来解释。如果没有特殊的意思,则反斜杠归反斜杠,后面那个字符归后面那个字符。

所以'\n','\b','\t'同 r'\n',r'\b',r'\t' 不一样。但是'\+', r'\+'则完全相同。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:55:28IT运维版块每日发帖之星
日期:2016-07-29 06:20:00
25 [报告]
发表于 2010-11-25 10:42 |只看该作者
回复 20# donotblock


    尤溪。。。

论坛徽章:
0
26 [报告]
发表于 2010-11-25 22:56 |只看该作者
回复  eeeee159963


    我觉得你还是没有很明白呢…… - -#
我再讲一下好了

先来说一下python的字 ...
ixuh 发表于 2010-11-24 22:36

很详细,十分感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP