爬虫流程:

正则表达式

正则表达式由字符操作符组成

常用操作符:

举例:

经典正则表达式:

eg:

Re库:

re库可以采用raw string类型表示正则表达式,表示为: r'text', PS: raw string是不包含对转义符再次转义的字符串

例如:r'[1‐9]\d{5}'
r'\d{3}‐\d{8}|\d{4}‐\d{7}'

Re库主要函数:

re.search: 在整个字符串中搜索匹配

1
2
3
4
5
6
import re
match = re.search(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))

#100081

re.match: 与re.search类似,但是是从字符串开始位置起匹配表达式,返回match对象

1
2
3
4
5
import re
match = re.match(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))
#报错,因为BIT未匹配到

re.findall:

1
2
3
4
import re
ls = re.findall(r'[1-9]\d{5}','BIT100081 TSU10084')
ls
# ['10081','10084']

re.split:

1
2
3
4
5
import re
re.split(r'[1-9]\d{5}','BIT100081 TSU10084')
#['BIT','TSU','']
re.split(r'[1-9]\d{5}','BIT100081 TSU10084',maxsplit=1)
#['BIT','TSU100084']

re.finditer:

1
2
3
4
import re
for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084')
# 100081
# 100084

re.sub:

1
2
3
import re
re.sub(r'[1-9]\d{5}',':zipcode',"BIT100081 TSU100084")
# 'BIT:zipcode TSU:zipcode'

re库的面向对象方法:

1
rst = re.search(r'[1-9]\d{5}',"BIT 100081") #对比——函数式:一次性操作
1
2
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081') #面向对象用法
**re库的match对象:**

match对象是一次匹配的结果,包含匹配的很多信息

1
2
3
4
5
match = re.search(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))
type(match)
# <class '_sre.SRE_Match'>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re
m =re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
m.string
#"BIT100081 TSU100084"
m.pos
# 0
m.endpos
# 19
m.group(0)
# '100081'
m.start()
# 3
m.end()
# 9
m.span()
# (3,9)

re库的贪婪匹配和最小匹配:

1
2
3
4
5
6
7
8
# 贪婪匹配——默认采用贪婪匹配,即输出匹配最长的子串
match = re.search(r'PY.*N','PYANBNCNDN') # *代表对前一个字符,也就是'.'的无限次或0次扩展,而'.'为任意
match.group(0)
# 'PYANBNCNDN'

#最小匹配:加一个问号
match = re.search(r'PY.*?N','PYANBNCNDN')
match.group(0)

总结:

参考:
b站视频:嵩天教授的Python网络爬虫与信息提取课程