目录
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!