写在前面,写下这篇博客是为了回顾这两天的学习内容,在需要的时候方便寻找,同时也是为广大的网友提供一个“信息”的平台
①原子:
- 普通字符作为原子的情况:
import re #导入Python内置库re,正则表达式"标配"
string = "taoyunjiaoyu" #搜索所在的整体
pat = "yun" #我们要搜索的信息
rst = re.search(pat,string) #利用re库里面的search方法,快速定位含有pat信息的位置
print(rst)
最后的显示结果是:<re.Match object; span=(3, 6), match='yun'>
- 非打印字符作为原子,所谓的非打印字符就是:不是输出来的东西
例如:\n换行符,\t制表符
import re
string = '''taoyunjiaoyu
baidu'''
pat = "\n"
rst = re.search(pat,string)
print(rst)
''''''代表的是长字符串,换行的时候就相当于一个"换行符",注意:在IDLE中把长字符串换成""会报错
显示结果是:<re.Match object; span=(12, 13), match='\n'>
- 通用字符作为原子,所谓的通用字符就是:用一个字符来代替一类东西
常用的通用字符有:
'''
\w 匹配任何一个字母、数字、下划线
\W 匹配除字母、数字、下划线外的任意一个字符
\d 匹配十进制数
\D 匹配除十进制数外的任何一个字符
\s 匹配一个空白字符
\S 匹配除空白字符外的任何一个字符
'''
import re
string = "taoyunjiao 938746562378yu"
pat = "\s\w\d\d\d"
rst = re.search(pat,string)
print(rst)
最后显示是:<re.Match object; span=(10, 15), match=' 9387'>
具体解释为:\s匹配空白字符,\w是匹配字母、数字、下划线中的任意一个字符,\d匹配的是十进制数
所以最后匹配的肯定是 9387这个字符串
在这里,说一下,就是想提取多少信息,就用几个"\"组合
- 原子表:[xyz]在使用的时候表示在表中任意提取出一个原子来
import re
string = "taoyunji938746562378aoyu"
pat1 = "tao[xyz]un"
pat2 = "tao[^yun]"
rst1 = re.search(pat1,string)
rst2 = re.search(pat2,string)
print(rst1)
print(rst2)
最后的显示结果是:
<re.Match object; span=(0, 6), match='taoyun'>
None
解释一下就是:rst1显示的结果是——在[xyz]中因为有y,和后面的un正好组成一对,而我们搜索的范围里面恰好有yun,所以最后显示的结果必然是含有"yun"的一个表达式,想一想,如果搜索范围内是zun,那我们最后显示的表达式必然是含有"zun"的表达式。rst2中^的意思是:取出除^后面的字符外的任意一个字符,所以如果pat里面的是[^xyz],那么最后显示的必然是None,反之,如果是[^abc],那么最后显示的肯定还是正确信息
②元字符——正则表达式中具有一些特殊含义的字符,比如重复n次前面出现的内容
'''
. 除换行符外的任意一个字符
^ 如果这个符号不在原子表里面,代表匹配开始位置,在的话则表示“非”的意思
$ 匹配结束时的位置
* 代表前面的原子出现0次,1次或多次
? 出现0次或1次
+ 代表前面的原子出现1次或多次
{n} 大括号里面加上数字:表示前面恰好出现n次
{n,} 代表前面至少出现n次
{n,m} 代表至少出现n次,至多出现m次
| 代表模式选择符“或”
() 代表模式单元
'''
import re
string = '''taoyunji2983765yubaidu'''
pat = "tao.un"
pat1 = "tao..."
#指定开始的时候:
pat2 = "^tao.."
pat3 = "bai..$"
#注意:$匹配的必须是最后一个位置,要不然最后显示的时候是"None"
rst = re.search(pat,string)
rst1 = re.search(pat1,string)
rst2 = re.search(pat2,string)
rst3 = re.search(pat3,string)
print(rst,rst1)
print(rst2,rst3)
最后的显示结果是:
<re.Match object; span=(0, 6), match='taoyun'> <re.Match object; span=(0, 6), match='taoyun'>
<re.Match object; span=(0, 5), match='taoyu'> <re.Match object; span=(17, 22), match='baidu'>
解释一下:.代表的是除换行符外的任意一个字符,缺少几个字符就用几个.,另外$只有恰好在终止位置的时候才能起到作用,否则的话就是None
import re
string = '''taoyunji2983765yubaidu'''
pat = "tao.*"
rst = re.search(pat,string)
print(rst)
#在这时会一直匹配到结尾,因为.代表任意字符,*代表前面出现0次,1次,多次,所以最后显示全部信息
dos = "tao.+"
dos_tb = re.search(dos,string)
print(dos_tb)
#+号匹配的也是所有的
os = "taoyunnn?"
os_tb = re.search(os,string)
print(os_tb)
#?适用的条件时前面正好出现0次或1次
string_n = "taoyunnnnji8273645yubaidu"
patt = "yun{4}"
patt1 = "yun{2,}"
#如果前面恰好出现n次,则全部输出,后面加一个","的形式,则也会全部输出(至少2次)
rstt = re.search(patt,string_n)
rstt1 = re.search(patt1,string_n)
print(rstt)
print(rstt1)
显示的结果是:
<re.Match object; span=(0, 22), match='taoyunji2983765yubaidu'>
<re.Match object; span=(0, 22), match='taoyunji2983765yubaidu'>
None
<re.Match object; span=(3, 9), match='yunnnn'>
<re.Match object; span=(3, 9), match='yunnnn'>
解释一下:.*显示后面的所有内容,{4}代表如果前面的字符恰好出现4次则将4次全部显示出来,否则显示"None",{2,}代表的意思自然就是:如果这个字符至少出现2次,那么就会显示出来所有内容,否则的话也是显示"None"
③模式修正符:可以在不改变正则表达式的情况下,通过模式修正符来改变正则表达式的含义,从而实现一些匹配结果的调整等功能
'''
I 匹配的时候忽略大小写
M 多行匹配
L 代表本地化识别匹配
U 根据Unicode进行解析
S 让.匹配包括换行符*
'''
import re
string = "Python"
pat = "pyt"
rst = re.search(pat,string)
print(rst)
rst1 = re.search(pat,string,re.I)
print(rst1)
显示的结果是:
None
<re.Match object; span=(0, 3), match='Pyt'>
其中,由于咱们的搜索范围内是没有"pyt"的,所以最后显示的是None,但是我们在rst1的时候加上了.I表示我们忽略大小写的信息,所以最后显示的是"Pyt"
好的,今晚就到这了,最后我想说的是:模式修正符,我前两天才看到,但是在今天写文章的时候一时想不起来这是干啥的,所以大家多费点心,记下这个不常见的用法。