1. 概述
所谓正则表达式是一个特殊的字符序列,它能检查一个字符串是否与某种模式匹配。
python中有标准库模块re,使得python有全部的正则表达式能力,以下介绍python中常用的几种正则表达式函数。
2. re.match()
尝试从字符串的起始位置匹配一个模式,匹配成功返回match对象,否则返回None
import re
tel_reg = '^1[0-9]{10}$'
r1 = re.match(tel_reg, '12345678910')
r2 = re.match(tel_reg, '123456789ab')
print(r1)
print(r2)
>>> <re.Match object; span=(0, 11), match='12345678910'>
>>> None
上面的例子是匹配以1开始的并以数字结尾11位数号码,其中
- ^ 表示以XX开始, $ 表示以XX结束;
- [ ] 中括号中的字符可以全部匹配,[^ ] 表示不匹配;
- { 10 }规定量词, 表示出现10次,{1, }出现1次以上,{1, 10}出现1--10次;
- ( )小括号可以对正则分组,group(0)或group()返回所有匹配内容,group(n)返回第n组内容。
3. re.search()
扫描整个字符串并返回以一个成功的匹配
import re
content = 'aaa121aad323ddd'
reg = '\d+'
re = re.search(reg, content)
print(re.span())
print(re.group())
>>> (3, 6)
>>> 121
匹配字符串中第一次出现的数字,span()函数可以获取索引
match和search的区别:match会匹配字符串的开始,如果一开始不符合正则,那么匹配就会失败,返回None,而search会匹配整个字符串,直到找到一个匹配的。
4. re.findall()
查找所有符合的匹配项,返回一个列表,如果没有匹配到则返回空列表
下面利用 findall() 函数爬取猫眼电影榜单数据

猫眼电影榜单
import requests
import re
def html_data(page):
offset = 'offset=' + str((page - 1) * 10)
url = 'https://maoyan.com/board/4?' + offset
response = requests.get(url).text
return response
def find_name(html_text):
reg = '.*?name.*?<a.*?>(.*?)</a>'
r = re.findall(reg, html_text)
return r
def find_star(html_text):
reg = '.*?star.*?>(.*?)</p>'
r = re.findall(reg, html_text, re.S)
return list(map(str.strip, r))
def find_time(html_text):
reg = '.*?releasetime.*?>(.*?)</p>'
r = re.findall(reg, html_text, re.S)
return r
def find_score(html_text):
reg1 = '.*?score.*?<i.*?integer.*?>(.*?)</i>'
reg2 = '.*?score.*?<i.*?fraction.*?>(.*?)</i>'
r1 = re.findall(reg1, html_text, re.S)
r2 = re.findall(reg2, html_text, re.S)
score = []
for i, j in zip(r1, r2):
k = str(i) + str(j)
score.append(k)
# score = list(zip(r1, r2))
# rs = map(lambda x: str(x[0]) + str(x[1]), score) # 用map函数
return score
def get_move_data(html_text):
name_list = find_name(html_text)
star_list = find_star(html_text)
time_list = find_time(html_text)
score_list = find_score(html_text)
for name, star, time, score in zip(name_list, star_list, time_list, score_list):
yield {
'name': name,
'star': star,
'time': time,
'score': score
}
def show(page):
move_list = list(get_move_data(html_data(page)))
for move in move_list:
print('电影名称:' + move['name'])
print('评分:' + move['score'])
print(move['star'])
print('上映时间:' + move['time'])
print('-' * 100 + '\n')
show(1)

运行结果
5. 其他
-
re.sub()
替换符合格式的内容
import re
content = '12adasdasd'
reg = '\d+'
r = re.sub(reg, '', content) # 把数字替换空字符
print(r)
>>> adasdasd
-
re.I 和 re.S
re.I忽略大小写,re.S使之可以匹配包括换行符在内的所有字符 -
compile()
用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 、 search()和sub()等函数使用。
import re
c1 = '2019-6-29 14:10'
c2 = '2019-9-13 17:40'
p = re.compile('\d{2}:\d{2}')
print(re.sub(p, '', c1))
print(re.sub(p, '', c2))
>>> 2019-6-29
>>> 2019-9-13