基础知识,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
相关推荐
Python 的 `re` 模块提供了多种方法来使用正则表达式,包括 `re.search()`, `re.match()`, `re.findall()`, `re.split()`, `re.finditer()`, `re.sub()` 和 `re.compile()`。下面我们将详细介绍这些方法的用法。 1....
re.Match类介绍 re.Match类是Python的re模块中用于表示匹配结果的类。当我们使用re模块中的re.match、re.search或re.finditer方法时,返回的结果...然后,我们使用re.Match对象的属性和方法来获取匹配结果的详细信息。
匹配成功,re.match() 返回一个匹配的对象,否则返回None. pattern – 匹配的正则表达式 string – 要匹配的字符串 flags – 标志位,控制正则表达式的匹配方式,如,是否区分大小写,多行匹配等. e.g. #!/usr/...
Rematch 是一个强大的 Python 库,它主要用于处理和解析各种数据结构,特别是针对字符串匹配和模式查找的问题。这个“Python-Rematch简体中文版本地化文件”是 Rematch 库的中文本地化版本,目的是为了让中国用户更...
本文实例讲述了Python3中正则模块re.compile、re.match及re.search函数用法。分享给大家供大家参考,具体如下: re模块 re.compile、re.match、 re.search re 模块官方说明文档 正则匹配的时候,第一个字符是 r,...
介绍: match()方法用于从字符串的开始位置进行匹配,如果起始位置匹配成功,则返回Match对象,否则返回None 语法: re.match(pattern,string,[flags]) pattern: 模式字符串 string:要匹配的字符串 flags:可选参数,比如...
Python语言中的re模块是处理正则表达式的核心模块,提供了多种方法来实现字符串匹配、搜索、替换等操作。本文将详细介绍re模块的使用方法和示例代码。 1. re.findall() 方法 re.findall() 方法用于查找所有符合...
- `re.match(pattern, string)`: 从字符串的开始位置匹配模式,如果匹配成功返回一个匹配对象,否则返回None。 - `re.search(pattern, string)`: 在整个字符串中搜索模式,一旦找到匹配就返回一个匹配对象,如果找...
4. **模式修饰符**:如 `re.DOTALL`(`.` 匹配任何字符,包括换行符),`re.MULTILINE`(使 `^` 和 `$` 能够匹配每一行的开头和结尾)等。 - 示例: ```python import re text = "Hello\nWorld" pattern = re....
正则表达式是 Python 中的一种强大工具,用于匹配和处理字符串。下面是 Python 正则表达式笔记中的一些重要知识点: 1. 导入模块:在使用正则表达式之前,需要导入 re 模块。import re 2. 常用函数:re 模块提供了...
re_match
该对象可以被用于匹配和替换操作。 #### 4. 常用函数 - **re.match**:尝试从字符串的起始位置匹配一个模式,如果不是从起始位置开始匹配,则返回None。 - **re.search**:在整个字符串中查找符合模式的第一个匹配...
1. 匹配(Match):通过`re.match()`或`re.search()`函数检查字符串是否符合正则表达式,返回True或False。 2. 获取(Extract):使用正则表达式从字符串中提取符合规则的部分,如`re.findall()`。 3. 替换(Replace...
本文介绍了Python中re模块的基本概念和使用方法,并通过示例详细解释了如何使用`re.compile`编译正则表达式、`re.match`和`re.search`等函数来匹配字符串。正则表达式是文本处理的强大工具,熟练掌握它可以极大地...