`
yangguangfu
  • 浏览: 1540998 次
  • 性别: 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
分享到:
评论

相关推荐

    正则表达式笔记(re.search_re.match_re.split_re.compile_用法) - douzujun -

    Python 的 `re` 模块提供了多种方法来使用正则表达式,包括 `re.search()`, `re.match()`, `re.findall()`, `re.split()`, `re.finditer()`, `re.sub()` 和 `re.compile()`。下面我们将详细介绍这些方法的用法。 1....

    第十五天 03re.Match类介绍【千锋Python人工智能学院】1

    re.Match类介绍 re.Match类是Python的re模块中用于表示匹配结果的类。当我们使用re模块中的re.match、re.search或re.finditer方法时,返回的结果...然后,我们使用re.Match对象的属性和方法来获取匹配结果的详细信息。

    Python 正则表达式 re.match/re.search/re.sub的使用解析

    匹配成功,re.match() 返回一个匹配的对象,否则返回None. pattern – 匹配的正则表达式 string – 要匹配的字符串 flags – 标志位,控制正则表达式的匹配方式,如,是否区分大小写,多行匹配等. e.g. #!/usr/...

    Python-Rematch简体中文版本地化文件

    Rematch 是一个强大的 Python 库,它主要用于处理和解析各种数据结构,特别是针对字符串匹配和模式查找的问题。这个“Python-Rematch简体中文版本地化文件”是 Rematch 库的中文本地化版本,目的是为了让中国用户更...

    Python3中正则模块re.compile、re.match及re.search函数用法详解

    本文实例讲述了Python3中正则模块re.compile、re.match及re.search函数用法。分享给大家供大家参考,具体如下: re模块 re.compile、re.match、 re.search re 模块官方说明文档 正则匹配的时候,第一个字符是 r,...

    re.match()使用方法详解与实战应用

    介绍: match()方法用于从字符串的开始位置进行匹配,如果起始位置匹配成功,则返回Match对象,否则返回None 语法: re.match(pattern,string,[flags]) pattern: 模式字符串 string:要匹配的字符串 flags:可选参数,比如...

    python之re模块使用(csdn)————程序.pdf

    Python语言中的re模块是处理正则表达式的核心模块,提供了多种方法来实现字符串匹配、搜索、替换等操作。本文将详细介绍re模块的使用方法和示例代码。 1. re.findall() 方法 re.findall() 方法用于查找所有符合...

    Python 03-RE.zip

    - `re.match(pattern, string)`: 从字符串的开始位置匹配模式,如果匹配成功返回一个匹配对象,否则返回None。 - `re.search(pattern, string)`: 在整个字符串中搜索模式,一旦找到匹配就返回一个匹配对象,如果找...

    re正则表达式的一点总结.txt

    4. **模式修饰符**:如 `re.DOTALL`(`.` 匹配任何字符,包括换行符),`re.MULTILINE`(使 `^` 和 `$` 能够匹配每一行的开头和结尾)等。 - 示例: ```python import re text = "Hello\nWorld" pattern = re....

    Python正则表达式笔记

    正则表达式是 Python 中的一种强大工具,用于匹配和处理字符串。下面是 Python 正则表达式笔记中的一些重要知识点: 1. 导入模块:在使用正则表达式之前,需要导入 re 模块。import re 2. 常用函数:re 模块提供了...

    re_match.py

    re_match

    正则表达式

    该对象可以被用于匹配和替换操作。 #### 4. 常用函数 - **re.match**:尝试从字符串的起始位置匹配一个模式,如果不是从起始位置开始匹配,则返回None。 - **re.search**:在整个字符串中查找符合模式的第一个匹配...

    Python程序设计:正则表达式检索与替换.pptx

    1. 匹配(Match):通过`re.match()`或`re.search()`函数检查字符串是否符合正则表达式,返回True或False。 2. 获取(Extract):使用正则表达式从字符串中提取符合规则的部分,如`re.findall()`。 3. 替换(Replace...

    Python正则表达式re模块简明笔记.docx

    本文介绍了Python中re模块的基本概念和使用方法,并通过示例详细解释了如何使用`re.compile`编译正则表达式、`re.match`和`re.search`等函数来匹配字符串。正则表达式是文本处理的强大工具,熟练掌握它可以极大地...

Global site tag (gtag.js) - Google Analytics