python—正则表达式

余生长醉 提交于 2020-02-12 04:08:57

正则表达式: 一种用来提取有用信息的表达式

原子:

原子是正则表达式的基本组成单位,每个正则表达式至少含有一个原子。
原子主要有以下几种类型:
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)
  1. search 任意位置匹配
  2. 全局匹配
    作用:可以匹配一个数据中多个符合条件
    格式
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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!