基本不用
如果想要多行和单行同时打勾,就需要用|或运算符
re模块会对模式进行编译(一般模式写的正则表达式都不怎么会进行修改),编译之后使用,效率更高,在项目使用中必须先编译,先把正则表达式用这个引擎先compile,编译之后得到一个正则表达式对象,这个对象就是关于python的,关于正则表达式的,下面就可以对字符串进行操作了,
python提供两套做法,一套编译后的做法,一套非编译后的做法(正则表达式使用都会编译的,编译就是避免反复编译,提高速度)
先写一个字符串测试一下
第一个函数match,有三个参数(pattern,string,flags(标志,单行多行这些东西,忽略大小写)
如果是多个的这么写即可,知道这么用即可
现在准备这么做,matcher匹配对象,没找到
一个区间0和1.这个索引放到切片里刚好能切除它来,但是现在只找到一个
找下o,找不到
bot在0到3的区间范围内
这里还有flags
编译后的对象拿到后,再match
这是两种写法,只要写个string即可
这两个是先编译后编译的问题
先编译得到对象,得到这个正在表达式对象,下面就去匹配,这个是手动编译一下
这个是你要找谁,然后去test里去找,
其实也是编译的,用这个方法就是内部要去编译
可以模式不变到其他字符串里面去找
这两种方式其实是一样的,只不过下面的是先手动编译,然后做匹配,上面的是内部编译
会把你匹配的pattern,这个patter就是你写的正则表达式进行编译
这么写只匹配b
总结:match不管你怎么写,根本不关心你里面怎么写
如下面虽然是多行但是还是没什么变化,
总结:match不管你多行单行,只从索引为0的开始
这个match,告诉你匹配了多少字符串
多行模式不管,只匹配到一个就结束了,不但匹配一个而且要求索引从0开始
我们之前练习的工具是全局的,match要求从索引0开始,如果索引0都匹配不上,后面就不用匹配了
单行模式
python也需要按照标准来,只有命名分组要注意语法不一样
看看match还有什么
还有pos,endpos
如何理解pos和endpos
从1开始逢8转行,索引匹配上,1开始,1-1位置7就取出了bag,说明这个位置可以调
写成11就是big
这个参数里就没有调整位置的
match只匹配一次但是必须从开头开始,开头跟指针有关,如果挪动pos,指针就跑了
match两种用法,编译后用,不编译用
search搜索
search找到第一个匹配之后就停止了,就不再继续搜索了
这两个方法用哪个都行
推荐这样的写法,应该先编译
match都是从开头开始,但是search就可以加^秃子符了
现在整好从1开始找到bottle了
调整一下就找不到了,在普通模式下,行首指的是最前面这个地方,指针指向1,就不是b开头的
编译时传一下,re.M多行,正则表达式一定要测试,因为方言的原因各个都不一样
现在就有多行了,秃子符就在行首,找到第二行了,search就不往下找了
search跟match一样找到就算了,不找了,match是锚定开头
search从你指定的位置向后找,如果找到就返回第一个匹配,第二个就不找
看下这后面能否起作用
,serch没有这个功能接收
serch没有这个功能接收
只能在compile编译的里面
编译完之后得到对象,然后search
正则表达式的编译还是比较耗时的,经常使用,建议使用编译后的对象调方法做,而不是一上来先写完,每次执行编译一次,特别浪费时间
这一块写的时候就需要特别注意
这就是search的行为,从你指定的位置开始向后找,但是找到第一个就返回了,没找到只能告诉你没有匹配到,返回一个none
这时候写什么开头和结尾就要按照什么多行单行来理解
search是从你指定的位置开始,向后找,找第一个匹配
这些都属于单词匹配
match是锚定开头的的,也可以在编译对象指定开始结束位置
1到4就找不到在这个范围里
意思在于full
full的意思是要把整个字符串指定的区域都算在内
加L虽然贪婪但是遇到L就停止了,这就不是fullmatch,差一个字符都不行
fullmatch既然是全部匹配,那匹配一小部分肯定不行的,只要不是匹配的所谓全长就出问题了
你这个匹配不带换行符\n,是匹配不上的
这个就是前包后不包,是可以完全匹配上的
这样应该就能匹配了
完全匹配就是,应该把你给的正则表达式,把你给定的子串里面的所有字符全部用到,这才叫full,这个叫完全匹配。其实就看下,左索引和右索引完全一致就是完全匹配了
match必须从头匹配,或者从指定的位置,不要求完全匹配,匹配上就行
search从你指定的地方找到第一个就停了
锚定开头和结尾必须一样,字符串多长全匹配上,fullmatch使用的很少,
多行模式下,托字符还是有用的
fullmatch,是前包后不包
match搞定的就是想象的search,从某个位置开始开始
全文搜索
单行的就把所有的匹配
这个是立即返回一个列表,列表放的是匹配的值
确定了里面全是字符串,findall是从当前字符串的,开头向后search,找到第一个不行,还要向后找一直找到结尾,把所有能匹配的项,转成字符串封装到列表
看看re.compile先编译一下,编译后也有findall
这个字符串想要从哪里到哪里查
立即返回列表,里面是匹配的字符串
search是返回的match对象
这个要编译,需要指定字符串
这个是一个迭代器
next一下转一下
findall是立即返回一个列表,里面 匹配的是字符串
finditer的方法可以拿到里面的每一次匹配对象,匹配对象带分组
(如果说仅仅匹配的东西就是你想要的,实际上可以不用这个)
findall,一个立即返回列表,里面是字符串,finditer是返回迭代器,迭代出的每一个都是match对象
全文搜索两套方法,1立即求值
2,返回迭代器,逐次迭代的
替换的方法
这里可以模式替换,还可以指定多少次,字符串的replace的就做不到
\w代表字符,数字,下划线
(模式,替换的字符,对什么操作)
不想换行也很简单,看的清楚一点,替换之后是新的字符串
count缺省值是0,(是遇到几个替换几个)
1就替换一次
上限100,但是都
这是两个版本,详细的,先编译后编译
subn是,切完之后返回的是一个元组,n代表替换了n次
模式替换,现在pattern模式里面,能替换的就替换了,但是string的replace就不可以
以前只能这么切,后面的\n就没办法
字符串的split能力太弱
用正则表达式,可以先把\s切割一下
为什么会出现这个,是按照一个字符一个字符来切的,碰到\n切一刀,\t切一刀
默认情况下是按照\s+切的,空白字符+切的
其实大多数工具都是用的\s+作为分隔符
现在是要把bag提取出来,旁边的()还在
这样就搞定了
把每行的单词提取出来
现在这样切出来是这个样子
这个就是个特例
这样也可以
因为这里切一刀免不了有个缺点
如果切出来空,循环的时候可以判断,这样也比我们之前处理字符串split要方便
分组,加一个小括号即可,(?:)这样分组就不存在了,(?P<)命名分组,python加P,还有断言
这样就可以了
str,一个字符串就没有分组
应该使用finditer,得到的结果在match对象中
套了括号就肯定有分组,每个match对象都有分组,一定要是match对象才有分组
match对象的分组就是自己,因为把自己包进去了
match匹配一次,里面有一个分组是b
finditer会返回match,match里面才能拿到group,match和group并不一致,要看你的括号在哪里
这样拿到一个可迭代对象results
有时候想要的不是match而是分组
如果写的是断言出来的就是直接想要的,可以不用分组,直接match结果可以用,直接用findall即可
groups看名字就是打印所有分组,results是返回的迭代器,不能直接groups,match对象才能groups
使用search试试,结果肯定是一个
groups还是bottle
group后面可以接受参数,分组从1 开始
0代表matcher,1代表分组号
0是跟你分组没有关系,0是匹配
现在没有分组,输入1就肯定报错
加了问号就分组彻底没了
命名分组,python要加P
试试命名分组有什么用
只要有分组都算groups,有分组都可以按groups来,只要有命名分组才进dict里,没有命名就不用进dict了,所有的分组都可以在groups里用,这个group都可以用索引的,分组是有分组号的,一定是用索引的
0指的是匹配
分组能给你返回一个字典
encode可以看到回车换行符
练习
能不能把标题提取出来,比如热点新闻
18位是2代,15位是老的
判断密码是不是强密码