正则表达式基础部分(1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43862765/article/details/101002290

写在前面,写下这篇博客是为了回顾这两天的学习内容,在需要的时候方便寻找,同时也是为广大的网友提供一个“信息”的平台

①原子:

  • 普通字符作为原子的情况:
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"

好的,今晚就到这了,最后我想说的是:模式修正符,我前两天才看到,但是在今天写文章的时候一时想不起来这是干啥的,所以大家多费点心,记下这个不常见的用法。

猜你喜欢

转载自blog.csdn.net/weixin_43862765/article/details/101002290