哪个网站有上门做指甲,免费云服务器有哪些,英国零售电商网站开发,网站开发教育上一节课我们通过一个例子#xff08;匹配 ip 地址#xff09;让大家初步了解到正则表达式的魔力#xff0c;也让大家充分了解到学习正则表达式是一个相对比较困难的事情。所以这一节课我们将继续学习 正则表达式的语法。
我们依稀还记得在Python中#xff0c;正则表达式是…上一节课我们通过一个例子匹配 ip 地址让大家初步了解到正则表达式的魔力也让大家充分了解到学习正则表达式是一个相对比较困难的事情。所以这一节课我们将继续学习 正则表达式的语法。
我们依稀还记得在Python中正则表达式是以字符串的形式来描述的正则表达式的强大之处在于特殊符号的应用我们上节课举了例子例如 点号.在正则表达式中表示匹配除了 换行符之外的任何字符它就是一个特殊的字符。正是这些特殊符号使得一个正则表达式可以匹配一个复杂的规则而不仅仅是匹配一个字符串如果你只需要匹配一个字符串那用 find() 方法就可以了。
我这里给大家准备了一个列表Python3 正则表达式特殊符号及用法详细列表。
这里罗列了python3 所支持的所有正则表达式的特殊符号以及具体的含义在难以理解的地方用斜体举了例子给大家看方便大家理解大家可以将这个文章收藏起来以后用到的时候查询就可以了切记不要死记硬背因为根本背不住如果背错了更扎心。
大家看到这里可能就会犯嘀咕了“好歹我也是见过世面的人啊为了查找一个字符串有必要掌握这么多规则吗”。
实话说没必要。我这里只是给大家做一个总结我们正常使用的情况下只是使用这里的一小部分另外一大部分只是为了应对突发情况而准备的。例如某一天你心血来潮想为你的规则再增加复杂一点的规则那么这里边正则表达式就可以应付自如了。一定要记住的是这里面的东西不要去背多做练习才是重要的啊。你掌握的东西才是你的背下来的东西过两天就不是你的了。
特殊符号是由两部分组成的一部分是 元字符。例如我们上节课讲的 点号(.)方括号([])反斜杠(\)等。 所有的元字符包括. ^ $ * ? { } [ ] \ | ( ) 另一部分就是 反斜杠加上普通符号组成的特殊符号它拥有特殊的含义。
首先来谈谈元字符
点号(.)是匹配除了换行符之外的任何字符。
| 就相当于逻辑或学过C语言的同学们都知道这就是按位或。A|B 表示匹配正则表达式 A或者B
例如 import re re.search(rPython(E|F), PythonE) _sre.SRE_Match object; span(0, 7), matchPythonE re.search(rPython(E|F), PythonF) _sre.SRE_Match object; span(0, 7), matchPythonF re.search(rPython(E|F), PythonD)
托字符(^)定位匹配匹配字符串的开始位置即确定一个位置。
例如 re.search(r^Python, I love Python) re.search(r^Python, Python, I love) _sre.SRE_Match object; span(0, 6), matchPython
跟托字符^对应的就是 美元符号$$ 匹配输入字符串的结束位置. re.search(rPython$, Python, I love) re.search(rPython$, I love Python) _sre.SRE_Match object; span(7, 13), matchPython
我们刚刚提到了值组就是用小括号括起来的我们上节课也用过了用小括号括起来跟数学的括号是一样的把一个东西当做一个整体那么就把它括起来。
接下来是史上最困难、最复杂的 反斜杠(\)反斜杠在正则表达式中应用是最广泛的它既可以将一个普通的字符变为特殊字符这部分内容下节课继续讲解同时也可以解除元字符的特殊功能这在上节课已经讲过例如 \. 匹配的就不是除换行符之外的任何字符了他匹配的就是一个点.了。
如果在反斜杠后面加的是数字那么还有两种表示方案
①如果跟着的数字是 1~99就表示引用序号对应的值组所匹配的字符串其中序号所对应的值组为 \ 前面的值组\序号必须在对应的值组的正后面序号为第几个值组。
例如 re.search(r(Python)\1, I love Python) re.search(r(Python)\1, I love PythonPython) _sre.SRE_Match object; span(7, 19), matchPythonPython
上面的(Python)是第一个值组序号是从1开始计算的因为0表示一个八进制数所以 \1且\1 表示Python其实 r(Python)\1 就等于 PythonPython。 re.search(r(love)(Python)\1, I lovelovePythonPython) #这样\1 是找不到 love的\序号必须在对应值组的正后方 re.search(r(love)\1(Python), I lovelovePythonPython) _sre.SRE_Match object; span(2, 16), matchlovelovePython re.search(r(love)(Python)\2, I lovelovePythonPython) _sre.SRE_Match object; span(6, 22), matchlovePythonPython re.search(r(love)\1(Python)\2, I lovelovePythonPython) _sre.SRE_Match object; span(2, 22), matchlovelovePythonPython
并不是要求全部都要是值组是要求 \序号 匹配的是值组 re.search(r(I )love(Python)\2, I lovePythonPython.com) _sre.SRE_Match object; span(0, 18), matchI lovePythonPython
②如果跟着的数字是 0 或者 3位的数字那么它是一个八进制数表示的是这个八进制数对应的 ASCII 码对应的字符。
例如字符 0 对应的十进制数为 48对应的八进制数为 60这里要三位数就是060所以 re.search(r\060, 0) _sre.SRE_Match object; span(0, 1), match0 re.search(rI love Python\060, I love Python0) _sre.SRE_Match object; span(0, 14), matchI love Python0
接下来要介绍的元字符是 中括号[ ]这是生成一个字符类事实上字符类就是一个字符集合的意思另外值的注意的是被中括号包含在里面的元字符都会失去特殊功能就像 反斜杠加上一个元字符是一样的举例 re.search(r[.], I love Python.com) _sre.SRE_Match object; span(13, 14), match.
字符类的意思就是将它里面的内容都当做普通的字符看待除了几个特殊的字符
①小横杠-我们用它表示范围我们上节课讲过这节课我们讲一个其他的方法re.findall() re.findall 在字符串中找到正则表达式所匹配的所有子串并把它们作为一个列表返回。 re.findall(pattern, string, flags0) 参数 参数描述pattern匹配的正则表达式string要匹配的字符串。flags标志位用于控制正则表达式的匹配方式如是否区分大小写多行匹配等等。 re.findall(r[a-z],12a32bc43jf3) [a, b, c, j, f]
findall 和 search 相比似乎更符合我们的需求但是当遇到值组时findall 也会有陷阱我们后面会讲解。
②反斜杠(\)把反斜杠放在字符类[ ]中它也不是表示本身这样会报错 re.findall(r[\],12a32bc43jf3) Traceback (most recent call last): File pyshell#47, line 1, in module re.findall(r[\],12a32bc43jf3) File D:\ProgramFiles\Anaconda3\lib\re.py, line 213, in findall return _compile(pattern, flags).findall(string) File D:\ProgramFiles\Anaconda3\lib\re.py, line 293, in _compile p sre_compile.compile(pattern, flags) File D:\ProgramFiles\Anaconda3\lib\sre_compile.py, line 536, in compile p sre_parse.parse(p, flags) File D:\ProgramFiles\Anaconda3\lib\sre_parse.py, line 829, in parse p _parse_sub(source, pattern, 0) File D:\ProgramFiles\Anaconda3\lib\sre_parse.py, line 437, in _parse_sub itemsappend(_parse(source, state)) File D:\ProgramFiles\Anaconda3\lib\sre_parse.py, line 545, in _parse source.tell() - here) sre_constants.error: unterminated character set at position 0
反斜杠在字符类里表示Python 字符串的转义符。
在字符串里我们都知道 \n 表示回车的意思所以 re.findall(r[\n],12a32\nbc43jf3) [\n]
③托字符 ^在字符类[ ]里表示‘除了’取反的意思但是要注意的是这个托字符 ^ 必须放在最前面 re.findall(r[^a-z],12a32bc43jf3) [1, 2, 3, 2, 4, 3, 3]
如果放在后面就是表示匹配它本身 re.findall(r[a-z^],12a32bc^^43jf3) [a, b, c, ^, ^, j, f]
最后要介绍的元字符 是用于做重复的事情例如我们上节课讲到的 大括号{ }如{M,N}要求M,N均为非负整数且MN表示前面的内容匹配 M~N次。 re.search(rPython{3}, I love Pythonnn) _sre.SRE_Match object; span(7, 15), matchPythonnn re.search(r(Python){3}, I love PythonPythonPython) _sre.SRE_Match object; span(7, 25), matchPythonPythonPython
在正则表达式中需要注意的是大家在写编程的时候可能会注意美观可能会多加一些空格但是在正则表达式里面你千万不能加空格例如 re.search(r(Python){1,5}, I love PythonPythonPython) _sre.SRE_Match object; span(7, 25), matchPythonPythonPython re.search(r(Python){1, 5}, I love PythonPythonPython)
因为空格会被解析为一个正则表达式。
最后我们来谈一下几个特殊的
①星号*匹配前面的子表达式零次或多次等价于 {0,} ②加号匹配前面的子表达式一次或多次等价于 {1,}
③问号匹配前面的子表达式零次或一次等价于 {0,1}
在正则表达式中如果实现条件一样推荐大家使用左边的 * 这三个不要使用 大括号{ }因为首先星号、加号、问号更加简洁其次正则表达式内部会对这三个符号进行优化效率会比使用大括号要高一些。
最后我们来谈一下 贪婪 和 非贪婪。
关于我们这个 重复 的操作有一点需要注意的就是正则表达式默认是启用 贪婪 的模式来进行匹配的那什么是 贪婪 呢贪婪就是贪心也就是说只要在符合的条件下它会尽可能多的去匹配例如前面的 re.search(r(Python){1,5}, I love PythonPythonPython) 就会直接匹配到3个 Python。
我们来看一个现实中的案例。假设我们想 匹配 html s htmltitle I love Python.com/title/html re.search(r., s) _sre.SRE_Match object; span(0, 46), matchhtmltitle I love Python.com/title/html
. 表示以 开头以 结尾重复 . 号 1次或多次。最后匹配了字符串全部。很明显这不是我们想要的结果。
因为贪婪会在条件符合的情况下尽可能多的去匹配既然是这样我们就必须启用 非贪婪模式才可以那么非贪婪模式怎么样启用呢
很简单在表示重复的元字符后面再加上一个问号这时候问号就不代表0次或1次了而是表示启用非贪婪模式 re.search(r.?, s) _sre.SRE_Match object; span(0, 6), matchhtml
好了到这里正则表达式的所有元字符我么就讲解完毕了大家课后一定要勤加练习。