python爬虫(3)——re库的使用

目录

re库的使用

正则表达式介绍

匹配普通字符

匹配通用字符

匹配数字、中文及英文

原子表

常用元字符

匹配固定次数

匹配多个正则表达式

分组

贪婪模式和非贪婪模式

compile函数

match函数和search函数

findall函数和finditer函数

split函数和sub函数


re库的使用

正则表达式介绍

import re

# 正则表达式
# 针对字符串进行数据筛选的表达式,匹配数据
# 使用正则表达式需要引入模块re

str = "唐僧孙悟空猪八戒沙僧小白龙"  # 这是一个字符串
pat = "猪八戒"  # 这是一个正则表达式
result = re.search(pat, str)  # 在str中寻找是否有符合pat表达式的值
print(result)  # 打印结果

打印结果为:

<re.Match object; span=(5, 8), match='猪八戒'>

匹配普通字符

import re

# 原子:是正则表达式中试下匹配的基本单位
# 元字符:正则表达式中含有特殊含义的字符
# 以普通字符为原子(匹配一个普通字符)
s = "天地玄黄宇宙洪荒"  # 要匹配的字符串
pat = "人"  # 正则表达式
result = re.search(pat, s)  # 使用re模块进行匹配
print(result)  # 打印

打印结果为:

None

匹配通用字符

import re

# 匹配通用字符
# \w 任意字母/数字/下划线
# \W 和小写w相反,匹配除任意字母/数字/下划线的字符
# \d 十进制数字
# \D 除十进制数以外的字符
# \s 空白字符
# \S 大写的S,匹配非空白字符

num = "1008611"  # 需要匹配的字符串
pat = "\d\d\d\d\d\d\d"  # 正则表达式,匹配7个数字
print(re.search(pat, num))  # 打印

控制台打印:

<re.Match object; span=(0, 7), match='1008611'>

匹配数字、中文及英文

import re

# 匹配数字,英文,中文
# 数字 [0-9]
# 英文 [a-z][A-Z]
# 中文 [\u4e00-\u9fa5]

s = "#$@@%$@$@$^%@$&*#$@$(#$_)(*$@$唐僧+_)(%^*($boy!~@`13"  # 要进行匹配的数据字符串

pat1 = r"[0-9][0-9]"  # 匹配两个数字
pat2 = r"[a-z][a-z][a-z]"  # 匹配三个英文字母
pat3 = r"[\u4e00-\u9fa5][\u4e00-\u9fa5]"  # 匹配两个中文

result1 = re.search(pat1, s)  # 进行匹配
result2 = re.search(pat2, s)  # 进行匹配
result3 = re.search(pat3, s)  # 进行匹配

print(result1, result2, result3)  # 打印

控制台打印:

<re.Match object; span=(48, 50), match='13'> 
<re.Match object; span=(41, 44), match='boy'> 
<re.Match object; span=(30, 32), match='唐僧'>

原子表

import re

# 原子表
# 定义一组平等的原子,只要有一个能够匹配就成功

s1 = "17890023324"  # 要进行匹配的字符串
pat1 = "1[3578]\d\d\d\d\d\d\d\d\d"  # 匹配一组电话号码,是13或15或17或18开头的
print(re.search(pat1, s1))  # 打印

s2 = "abcdepytabon"  # 要进行匹配的字符串
pat2 = "pyt[abh]on"  # 正则表达式,要么是pytaon或pytbon或python,但不能是pytabon或pytahon或pytbhon
print(re.search(pat2, s2))  # 打印,只能匹配一个原子

控制台打印:

<re.Match object; span=(0, 11), match='17890023324'>
None

常用元字符

import re

# 元字符
# 元字符是正则表达式中具有特殊含义的字符
# . 匹配任意字符,但"\n"除外
# ^ 匹配字符串开始的位置
# $ 匹配字符串中结束的位置
# ? 重复0次或1次前面的原子
# + 重复1次或多次前面的原子
# * 重复0次或1次或多次前面的原子

s = "10086112346454343299054"  # 要匹配的字符串
pat = "^1.*4$"  # 匹配以1开头,以4结束,中间任意字符的正则表达式
print(re.search(pat, s))  # 打印匹配结果

控制台打印:

<re.Match object; span=(0, 23), match='10086112346454343299054'>

匹配固定次数

import re

# 匹配固定次数
# {n} 前面的原子出现了n次
# {n,} 至少出现n次
# {n,m} 出现次数在介于n-m之间

s1 = "18911223465"
pat = r"\d{11}"  # 表示匹配11位数字
print(re.search(pat, s1))  # 打印结果

s2 = "abdewfsd"
pat2 = r"\S{10,}"  # 表示匹配至少10位非空白字符
print(re.search(pat2, s2))  # 打印结果

s3 = "abcdef1234"
pat3 = r"\S{6,12}"  # 表匹配6-12位非空白字符
print(re.search(pat3, s3))  # 打印结果

控制台打印:

<re.Match object; span=(0, 11), match='18911223465'>
None
<re.Match object; span=(0, 10), match='abcdef1234'>

匹配多个正则表达式

import re

# 匹配多个正则表达式
# | 用来分隔多个正则表达式

s1 = "13590870826"  # 字符串
s2 = "123-7896543"  # 字符串
pat1 = r"13\d{9}"  # 匹配一个由13开头的手机号码
pat2 = r"\d{3}-\d{7}"  # 匹配一个座机号
print(re.search(pat1, s1))  # 打印
print(re.search(pat2, s2))  # 打印

# 使用|来匹配多个正则表达式
pat3 = r"13\d{9}|\d{3}-\d{7}"  # 匹配一个由13开头的手机号或匹配一个座机号
print(re.search(pat3, s1))  # 打印
print(re.search(pat3, s2))  # 打印

控制台打印:

<re.Match object; span=(0, 11), match='13590870826'>
<re.Match object; span=(0, 11), match='123-7896543'>
<re.Match object; span=(0, 11), match='13590870826'>
<re.Match object; span=(0, 11), match='123-7896543'>

分组

import re

# 分组
# () 对需要匹配的内容分组

s1 = "dssfldsfjwerewjava!@#@@$@#(34344384!!#bdskfjwe1008611"  # 字符串
pat1 = "(java).{0,}(100\d{4})"  # 匹配java和1008611
print(re.search(pat1, s1).groups())  # 打印所有分组
print(re.search(pat1, s1).group(1))  # 打印第1个分组
print(re.search(pat1, s1).group(2))  # 打印第2个分组

s2 = "dslfjewkrjewwkfabc学习python爬虫123@#@$@$%45890djf"  # 字符串
pat2 = "abc(.*?)123"  # 获取abc同123之间的内容
print(re.findall(pat2, s2))  # 打印

控制台打印:

('java', '1008611')
java
1008611
['学习python爬虫']

贪婪模式和非贪婪模式

import re

# 贪婪模式和非贪婪模式
# 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配
# 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配
# python默认是贪婪匹配

s1 = "<a href='#'>张三</a><a href='#'>李四</a>"  # 字符串
pat1 = "<a.*</a>"  # ".*"表示贪婪模式正则表达式
print(re.search(pat1, s1))  # 贪婪模式匹配

s2 = "aa<div>test1</div>bb<div>test2</div>cc"  # 字符串
pat1 = "<a.*?</a>"  # ".*?"非贪婪模式正则表达式
print(re.search(pat1, s1))  # 非贪婪模式匹配

控制台打印:

<re.Match object; span=(0, 36), match="<a href='#'>张三</a><a href='#'>李四</a>">
<re.Match object; span=(0, 18), match="<a href='#'>张三</a>">

compile函数

import re

# compile函数 将正则表达式转换成内部格式,提高执行效率

s1 = "pythonsdkfsdlk343"  # 字符串
pat1 = re.compile(r"Python.*?", re.I)  # 正则表达式,re.I表示忽略大小写
print(pat1.search(s1))  # 打印

控制台打印:

<re.Match object; span=(0, 6), match='python'>

match函数和search函数

import re

# match函数和search函数
# match函数:匹配字符串的开头位置,只匹配一次,匹配成功一次就不再向后继续匹配了
# search函数:匹配字符串的任意位置,只匹配一次,匹配成功一次就不再向后继续匹配了

s1 = "dspython@$@rt454"  # 字符串
pat1 = re.compile(r"python")  # 正则表达式
print(pat1.match(s1))  # 打印

s2 = "dspython@$@rt454"  # 字符串
pat2 = re.compile(r"python")  # 正则表达式
print(pat2.search(s1).group())  # 打印

控制台打印:

None
python

findall函数和finditer函数

import re

# findall函数和finditer函数
# findall函数:查找所有匹配的内容,装到列表中
# finditer函数:查找所有匹配的内容,装到迭代器中

s1 = "python34234REdsffsdlkrwepython@#@$454kfpython"  # 字符串
pat1 = re.compile(r"python")  # 正则表达式
data = pat1.finditer(s1)  # 获取匹配到的迭代器
list1 = []  # 放置结果的列表
for d in data:
    list1.append(d.group())
print("finditer函数:")
print(list1)

s2 = "python34234REdsffsdlkrwepython@#@$454kfpython"  # 字符串
pat2 = re.compile(r"python")  # 正则表达式
list2 = pat2.findall(s2)  # 匹配
print("findall函数:")
print(list2)

控制台打印:

finditer函数:
['python', 'python', 'python']
findall函数:
['python', 'python', 'python']

split函数和sub函数

import re

# split()函数和sub()函数
# split函数:按照能够匹配的子串将字符串分割后返回列表
# sub函数:用于替换

s1 = "唐僧;;;孙悟空;;;;猪八戒;;;;;沙僧;;;;;;小白龙"  # 字符串
pat1 = re.compile(r";+")  # 正则表达式
result1 = pat1.split(s1)  # 将切割出来的值装到列表中
print(result1)  # 打印列表

s2 = "hello 123,hello 456!"  # 字符串
pat2 = re.compile(r"\d+")  # 正则表达式
result2 = pat2.sub("python", s2)  # "python"即你要替换成什么值,s2指的是你要对其进行替换的字符串
print(result2)  # 打印替换结果

控制台打印:

['唐僧', '孙悟空', '猪八戒', '沙僧', '小白龙']
hello python,hello python!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值