原子
1.原子:正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。
2.常见的原子类型:
- 普通字符
- 非打印字符 如\n,\t
- 通用字符 如\W,\w,\d,\S
- 原子表 如[xyz]
3.实战:
import re
string = '''123qwe456p
8888'''
patern = "qwe"
patern1 = "\n"
patern2 = "\d\d"
patern3 = "123[qrt]"
print(re.search(patern,string))
print(re.search(patern1,string))
print(re.search(patern2,string))
print(re.search(patern3,string))
============================= RESTART: F:/re.py =============================
<_sre.SRE_Match object; span=(3, 6), match='qwe'>
<_sre.SRE_Match object; span=(10, 11), match='\n'>
<_sre.SRE_Match object; span=(0, 2), match='12'>
<_sre.SRE_Match object; span=(0, 4), match='123q'>
元字符
元字符:正则表达式中具有一些特殊含义的字符。
实战:
. 除换行符外任意字符
^ 开始标记
$ 结束标记
* 0/多次
+ 1/多次
? 0/1
{n} n为数字,恰好n次
{n}至少n次
{n,m} 至少n,至多m次
| 模式选择符或
() 模式单元
ps:正则表达式默认采用贪婪模式,所以像使用+,*等的元字符都是匹配多次
import re
string = '''123qweee456p
8888'''
patern = "qwe?"
patern1 = "qwe??"
print(re.search(patern,string))
print(re.search(patern1,string))
============================= RESTART: F:/re.py =============================
<_sre.SRE_Match object; span=(3, 6), match='qwe'>
<_sre.SRE_Match object; span=(3, 5), match='qw'>
模式修正符
模式修正符:所谓模式修正符,即可以在不改变正则表达式的情况下,通过模式修正符
改变正则表达式的含义,从而实现一些匹配结果的调整等功能。
实战:
I 匹配时忽略大小写
M 多行匹配
S 让.忽略换行符
L 本地化识别匹配
U unicode
import re
string = "Python123"
patern = "pyt?"
rst = re.search(patern,string,re.I)
print(rst)
============================= RESTART: F:\re.py =============================
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
贪婪模式与懒惰模式
贪婪模式核心点:尽可能多的匹配
懒惰模式核心点:尽可能少的匹配
实战:
贪婪模式与懒惰模式
懒惰限定符
*? 重复0/多次,但尽可能少重复
+? 重复1/多次,但尽可能少重复
?? 重复0/1,但尽可能少重复
{n,m}? 重复n到m次,,,,
{n,}? 重复n次以上,,,,
import re
string = "Pythonyt123yt"
p1 = "Py.*?t"
p2 = "Py.+?t"
p3 = "Py.??t"
rst = re.search(p1,string)
rst1 = re.search(p2,string)
rst2 = re.search(p3,string)
print(rst)
print(rst1)
print(rst2)
============================= RESTART: F:\re.py =============================
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
<_sre.SRE_Match object; span=(0, 8), match='Pythonyt'>
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
正则表达式函数
re.match() 必须从字符串首开始匹配
re.search() 从字符串任意地方开始匹配
re.compile.findall() 全局匹配函数
import re
string = "PytPonyt123Pyt"
p1 = "P.*?t"
rst = re.compile(p1).findall(string)
print(rst)
============================= RESTART: F:\re.py =============================
['Pyt', 'Ponyt', 'Pyt']
常见正则实例
#匹配url
import re
string = "<a href='http://www.baidu.com'>百度首页</a>'"
p1 = "[a-zA-Z]+://[^\s]*[.com|.cn]"
rst = re.compile(p1).findall(string)
print(rst)
============================= RESTART: F:\re.py =============================
['http://www.baidu.com']
# 匹配国内电话号码
import re
string = "sjsh213-6565656564545sknsjcn1524-65555555555"
p1 = "\d{3}-\d{8}|\d{4}-\{7,8}"
rst = re.compile(p1).findall(string)
print(rst)
============================= RESTART: F:\re.py =============================
['213-65656565', '524-65555555']
简单爬虫的编写
# 出版社信息爬取并写入文件
import urllib.request
import re
data = urllib.request.urlopen("https://read.douban.com/provider/all").read().decode("utf-8")
pat = '<div class="name">(.*?)</div>'
rst = re.compile(pat).findall(data)
print(rst)
============================= RESTART: F:\re.py =============================
['安徽文艺出版社', '博集天卷', '百花洲文艺出版社', '北京阅览文化传播有限公司',
'博库网', '白马时光', '八光分文化', '凤凰联动', 'Fiberead', '果麦文化]
#写入文件
fh = open("F:/出版社.txt","w")
for i in range(0,len(rst)):
fh.write(rst[i]+'\n')
fh.close()