一、正则表达式:正则是很大的一个知识点,不会仅仅是下面这些东西
1、概念:正则表达式就是一种对字符串匹配的规则,注意是只对字符串,正则表达式和python没啥关系,
2、表达式:
(1)字符集:用中括号表示,例如[1-9],[012345],[a-z1-9],[A-z]
字符集代表的是一个字符的匹配规则,不需写标点符号,可以多种规则连着写,按从小到大的排列(ascii值,所以大写A到小写z也可以,但一般不这么写)
(2)元字符
. 匹配除换行符以外的任意字符
\w 匹配数字字母和下划线的字符 大写代表非数字字母下划线的字符
\s 匹配空白符 大写代表非空白符的字符
\d 匹配数字 大写代表非数字的字符
^ 匹配字符串的开始,写在开头 [ ^ ] 若写在字符集当中就代表除字符集中以外所有的字符
$ 匹配字符串的结尾,写在最后
(3)量词
* 零次或多次
+ 一次或多次
?零次或一次
{1}只有1次
{2,10}2到10次
{4,}4次或多次
规则:尽量匹配多次;量词只能操作前一个字符的次数。也就是说不会只对一个字符进行匹配就完了,而是将指定次数的匹配当作一次整体的匹配
(4)贪婪匹配:使用量词匹配,每次尽量匹配多次
非贪婪匹配:在量词后加?,就是尽量匹配最少次
(5)分组:小括号;可以把一组字符当作一个整体,匹配这个整体也可以使用量词使这个整体重复匹配;对于一条匹配的正则,只对需要的内容进行分组
(6)转义符:\ 对于一些有特殊意义的字符用\可以表示本身,在python中用r转义
补充:
1、回溯算法:例如<.*?> 会一直匹配,当遇到>后不会停止会继续匹配,待匹配到最后还是没有>就会回头回到之前的>
2、.*?字符 取前面任意长度的字符,直到字符出现
二、re模块
1、和正则的关系:python中的re模块就是为正则服务的
2、方法
(1)findall(正则,要匹配的字符串) 输出的列表类型,元素为每一个匹配的字符串;若没有匹配上,就输出空列表
(2)search(正则,要匹配的字符串) 输出的是一种对象并不显示匹配的字符串,通常用group()来显示匹配上的字符串
例如:
import re
ret = search(正则,字符串)
if ret : 若没有匹配上,则输出None
print(ret.group() ) 注意这里group只能显示第一个匹配上的字符串,若本身字符串很长有多个匹配项,但是group也只能显示出第一个
(3)match() 用法和search一样,但是,不同的是match会自动在正则前面加上^,代表以什么开头,所以group输出的值只能是字符串开始匹配上的字符
(4)分割 split(正则[ab],字符串)按照正则的规则依次分割,例如先匹配a后分割得到的结果再按b分割,最后输出的是列表
(5)替换 sub(正则,要替换的内容,字符串,次数) 按照正则匹配上的内容换成 要替换的内容 再输出替换好的字符串。次数是指替换几次,也就是替换前几个
(6)sunb()会直接显示输出替换的次数
(7)obj = re.compile (正则) 将正则表达式编译为正则表达式对象,这样可以用来对多个字符串进行相同正则的匹配
(8)finditer(正则,字符串) 会直接输出一个迭代器,可循环取值,取值时要用group()
三、进阶知识
1、findall优先级查询:会优先显示分组即小括号里的匹配内容,而自动不显示括号外的匹配内容
解决办法:(?:......... ) 只要在小括号里的开头加上问号和冒号,注意一定不要分开
2、split 优先级查询:若在正则表达式两边加了括号,则分割时还会显示出原本要匹配的内容,例如上一节中的(4)给[ab]加括号([ab]),这样的话分割出来的内容也会有a和b
3、匹配标签:在search方法中,在要选择输出的正则规则前面加上?P<名字>,然后把正则规则用小括号括起来
import re ret=re.search('<\w+>(?P<name>\w+)<\w+>','<h1>hello<h1>') print(ret.group('name'))
若遇到字符串有重复的内容使我们需要的,不能每一次都写一个新的名字,只要在需要的正则位置两边加上括号,开头写?P=名字,而且括号里的正则也不需要留着
import re ret=re.search('<(?P<name>\w+)>\w+<(?P=name)>','<h1>hello<h1>') print(ret.group('name'))