正则表达式: 一种用来提取有用信息的表达式
原子:
原子是正则表达式的基本组成单位,每个正则表达式至少含有一个原子。
原子主要有以下几种类型:
a:普通字符
b:非打印字符
c:通用字符
d:原子表
对应模块 re
#普通字符 作为原子
string="dfsffsfsg"
pat="ffs"
rs=re.search(pat,string)
print(rs)
# 结果(<_sre.SRE_Match object; span=(3, 6), match='ffs'>)
# 非打印字符作为原子(\n,\t等)
string='''sfrgagr
fa'''#'''换行,若是"则需加/n
pat="\n"
rs=re.search(pat,string)
print(rs)
#通用字符 作为原子
'''
常见通用字符
\w 字母,数字,下划线
\W 除去字母,数字,下划线...
\d 十进制数字
\D 除十进制数字
\s 空白字符
\S 除空白字符
'''
string="dfsff12323242sfsg"
pat="\d\d\d"#匹配三位十进制数字
rs=re.search(pat,string)
print(rs)
#结果 <_sre.SRE_Match object; span=(5, 8), match='123'>
# 原子表[]里面给出几种选择,满足一个即可
# 若原子表为[^],则表示除了原子表中的元素
string="sasdffghuewo"
pat="sd[derf]f"#匹配三位十进制数字
rs=re.search(pat,string)
print(rs)
#结果:<_sre.SRE_Match object; span=(2, 6), match='sdff'>
元字符
元字符:正则表达式中具有某些特殊含义的字符
import re
#元字符
'''
常见元字符
. 任意字符(除换行)
^ 开始位置(后面所跟字符必须处于开始位置)
$ 结束位置
| 表示或
* 出现0/1/多次
? 出现0/1次
+ 出现1/多次
{n} 出现恰好n次
{n,}至少出现n次
{n,m} 至少n次,至多m次
'''
string="dfsff12323242sfsg"
pat="^dfs"#匹配开始位置的dfs
pat="df.*"
#结果 <_sre.SRE_Match object; span=(0, 17), match='dfsff12323242sfsg'.出现了多次
pat="fsf{2}"
#<_sre.SRE_Match object; span=(1, 5), match='fsff'>
rs=re.search(pat,string)
print(rs)
模式修正符
模式修正符:在不改变正则表达式的情况下,通过模式修正符改变正则表达式含义
import re
#模式修正符
'''
常见模式修正符
I 忽略大小写
M 多行匹配
S .包括换行
U unicode编码
L 本地化识别匹配
'''
string="Python"
pat="^pyt"#匹配开始位置的dfs
rs=re.search(pat,string,re.I)#模式修正符加在这里
print(rs)
#<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
贪婪模式与懒惰模式
贪婪模式:尽可能多的匹配
懒惰模式: 尽可能少的匹配
import re
#贪婪模式和懒惰模式
string="P00ythosdny"
pat="^p.*y"#默认贪婪
#<_sre.SRE_Match object; span=(0, 11), match='P00ythosdny'>
pat1="p.*?y"#懒惰模式
#<_sre.SRE_Match object; span=(0, 4), match='P00y'>
rs=re.search(pat1,string,re.I)#模式修正符加在这里
print(rs)
正则表达式函数
1.match 从头开始匹配
#match
string="P00ythosdny"
pat="^p.*y"#在头
#<_sre.SRE_Match object; span=(0, 11), match='P00ythosdny'>
pat1="y.*y"#在中间
#None
rs=re.match(pat,string,re.I)#模式修正符加在这里
print(rs)
- search 任意位置匹配
- 全局匹配
作用:可以匹配一个数据中多个符合条件
格式
re.compile(正则表达式).findall(数据)
使用
import re
#全局匹配
string="P0ythophysdpjypddypny"
pat="p.*?y"#懒惰模式
rs=re.compile(pat).findall(string)
print(rs)
#['phy', 'pjy', 'pddy', 'pny']
实例
import re
#匹配网址
string='''<link ref="canonical" href="https://www.csdn.net/">'''
pat="[a-zA-z]+://[^\s]*[.com|.net|.cn]"
rs=re.compile(pat).findall(string)
print(rs)
#['https://www.csdn.net']
#匹配座机号
string="dhadhj027-4667572683dsdhfsu0531-8300218djjfa010-67223456"
pat="\d{3}-\d{8}|\d{4}-\d{7}"
rs=re.compile(pat).findall(string)
print(rs)
#['027-46675726', '0531-8300218', '010-67223456']
附一个简单的爬虫程序
爬好哥博客的时间~~(感谢好哥支持!!!!!)
#简单网页
import re
import urllib.request
data=urllib.request.urlopen("https://zhengzihao.online/archive/").read().decode("utf-8")
pat='''<time datetime="(\d{4}-\d{2}-\d{2})">'''
rs=re.compile(pat).findall(data)
print(rs)
来源:CSDN
作者:西瓜小侠
链接:https://blog.csdn.net/weixin_44677658/article/details/104259388