`
yangguangfu
  • 浏览: 1531519 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

re.match(r"\\w","\w")为什么匹配得到的是'\\w'?和re.match("\a","\a")匹配的时候为什么得到的是'\x07'?的研究

 
阅读更多

基础知识,Python中匹配特殊字符问题
\的含义:将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。
例如,’n’ 匹配字符 "n"。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 "\" 而 "\(" 则匹配 "("。


\s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

转义符号

正则表达式还支持大部分 Python 字符串的转义符号:\a,\b,\f,\n,\r,\t,\u,\U,\v,\x,\\
注1:\b 通常用于匹配一个单词边界,只有在字符类中才表示“退格”
注2:\u 和 \U 只有在 Unicode 模式下才会被识别
注3:八进制转义(\数字)是有限制的,如果第一个数字是 0,或者如果有 3 个八进制数字,
那么就被认为是八进制数;其他情况则被认为是子组引用;至于字符串,八进制转义总是最多只能是 3 个数字的长度


问题一:re.match("\a","\a")匹配的时候为什么得到的是'\x07'?

'\x07'是对应ASCII编码,python默认编码格式是utf-8,如果有时候utf-8中的编码中也会和ASCII重合部分,就会出现这种情况。

下面是在ipython3进入的终端上的代码:
re.match("a","a")
Out[6]: <_sre.SRE_Match object; span=(0, 1), match='a'>

In [7]: re.match("\a","\a")#按理说"\a"匹配"\a",应为是"\a"为什么是'\x07'呢?
Out[7]: <_sre.SRE_Match object; span=(0, 1), match='\x07'>

In [8]: re.match(r"\a","\a")
Out[8]: <_sre.SRE_Match object; span=(0, 1), match='\x07'>

In [183]: len("abc")#普通字符的长度是3
Out[183]: 3

In [9]: rs = r"\a"

In [10]: len("\x07") #长度为1,并不是长度3,证明不是普通的字符
 Out[1]: 1

下面证明A可以匹配\x41,\x41是对应的ascii吗中的A

In [103]: re.match(r"\x41","A")
Out[103]: <_sre.SRE_Match object; span=(0, 1), match='A'>

In [104]: re.match("\x41","A")
Out[104]: <_sre.SRE_Match object; span=(0, 1), match='A'>

下面的证明\x07就是\a

In [106]: re.match("\x07","\a")
Out[106]: <_sre.SRE_Match object; span=(0, 1), match='\x07'>

In [107]: re.match(r"\x07","\a")
Out[107]: <_sre.SRE_Match object; span=(0, 1), match='\x07'>







问题二、re.match(r"\\w","\w")为什么匹配得到的是'\\w'?

原因:Python正则表达式匹配特殊字符\w的时候转换成\\w再匹配

下面两个是匹配失败的
In [134]: re.match("\w","\w")#匹配失败的,为什么?

In [135]: re.match(r"\w","\w")#匹配失败的,为什么?


In [142]: re.match("\\w","\w")#匹配失败,为什么?

In [136]: re.match(r"\\w","\w")
Out[136]: <_sre.SRE_Match object; span=(0, 2), match='\\w'>

说明'\\w'

匹配的结果'\\w'怎么会多一个'\'呢,原因在于工具的不同,显示不同内容,换一个工具pycharm大于看看
import re
result = re.match(r"\\w","\w").group()
print(result)#输出\w

发现打印的是\w,也就是说终端\\w是为了显示\w,转义加上\,而pycharm中输出的是已经转义的了。
也就是说\\w要输出\w,特有加上了\,变成了\\w
证明想法:
s = "\\w"
print(s)#发现不管在终端和pycharm运行结果打印的是\w,证明了想法。

接下来证明
In [136]: re.match(r"\\w","\w")
<_sre.SRE_Match object; span=(0, 2), match='\\w'>


应为r"\\w"等价于 "\\\\w"  ;
那么问题来了,怎么 "\\\\w" 能匹配"\w"?我的猜想,字符串的"\w"估计不是字符串的"\w",而是"\\w"
证实我的猜想是否正确?
n [143]: re.match("\\\\w","\\w")
Out[143]: <_sre.SRE_Match object; span=(0, 2), match='\\w'>

发现全是如此,也就是说字符串中的\w等价于\\w,在匹配的过程中按照\\w匹配了。




如果按照此原理就能解释下面的情况了

下面是在ipython3进入的终端上的代码:

In [147]: re.match(r"\\d","\d")
Out[147]: <_sre.SRE_Match object; span=(0, 2), match='\\d'>

In [152]: re.match(r"\\s","\s")
Out[152]: <_sre.SRE_Match object; span=(0, 2), match='\\s'>

n [153]: re.match(r"\\W","\W")
Out[153]: <_sre.SRE_Match object; span=(0, 2), match='\\W'>

In [154]: re.match(r"\\S","\S")
Out[154]: <_sre.SRE_Match object; span=(0, 2), match='\\S'>

In [155]: re.match(r"\\D","\D")
Out[155]: <_sre.SRE_Match object; span=(0, 2), match='\\D'>

In [177]: re.match(r"\\B","\B")
Out[177]: <_sre.SRE_Match object; span=(0, 2), match='\\B'>


Out[35]re.match(r"\\j","\j")
Out[36]: <_sre.SRE_Match object; span=(0, 2), match='\\j'>





问题三,表示边界中的\b,当成字符串去正则中匹配的时候就是本身\b和re.match(r"\\b","\b")没有匹配成功的原因
In [166]: re.match(r"\\w","\w")#匹配成功上面已经证实了原因
Out[166]: <_sre.SRE_Match object; span=(0, 2), match='\\w'>

In [167]: re.match(r"\\b","\b")#这个怎么又没有匹配上呢

In [169]: re.match(r"\b","\b")#匹配失败
应为"\b"不等价于"\\b",就是本身自己"\b",又因为r"\b"等价于"\\b"的
正则表达式是:"\\b" ,要匹配的字符串是:"\b",他们都是普通字符了,他们是不匹配的,先这样想,接下来证实一下。
要想匹配普通字"\b",正则表达式只要写:"\b"即可。

证实我的想法如下:

In [170]: re.match("\b","\b")
Out[170]: <_sre.SRE_Match object; span=(0, 1), match='\x08'>


In [172]: re.match("\x08","\b")
Out[172]: <_sre.SRE_Match object; span=(0, 1), match='\x08'>

In [174]: re.match(r"\b","\b")#匹配不成功


综上所述表示边界中的\b,当成字符串去正则中匹配的时候就是本身\b
因此re.match(r"\\b","\b")没有匹配的原因也是上面的原理。

根据刚才的原理,也可以解释

In [179]: re.match(r"\\$","\$")匹配失败
In [179]: re.match(r"\\^","\^")匹配失败


同样也可以解释

In [55]: re.match("\n","\n")
Out[55]: <_sre.SRE_Match object; span=(0, 1), match='\n'>

In [56]: re.match("\na","\na")
Out[56]: <_sre.SRE_Match object; span=(0, 2), match='\na'>


In [59]: re.match("\\\\nabc","\\nabc")
Out[59]: <_sre.SRE_Match object; span=(0, 5), match='\\nabc'>


In [60]: re.match(r"\\nabc","\\nabc")
Out[60]: <_sre.SRE_Match object; span=(0, 5), match='\\nabc'>
r"\\nabc"等价'\\\\nabc'


参考文献:
https://www.zhihu.com/question/23374078
http://blog.csdn.net/l347129991/article/details/70257704
http://www.cnblogs.com/jingleguo/archive/2008/06/02/1211820.html
http://www.360doc.com/content/13/0125/13/3046928_262317374.shtml

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics