1. 常用的匹配规则

### 常用的匹配规则
# \w 匹配字母、数字及下划线
# \W 匹配不是字母、数字及下划线的字符
# \s 匹配任意空白字符,等价于[\t\n\t\f]
# \S 匹配任意非空字符
# \d 匹配数字,等价于[0-9]
# \D 匹配任意非数字的字符
# \A 匹配字符串开头
# \Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
# \z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
# \G 匹配最后匹配完成的位置
# \n 匹配一个换行符
# \t 匹配一个制表符
# ^ 匹配一行字符串的开头
# $ 匹配一行字符串的结尾
# . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
# [...] 用来匹配一组字符的任意一个字符
# [^...] 用来匹配不在[]中的字符
# * 匹配0个或多个表达式
# + 匹配1个或多个表达式
# ? 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式
# {n} 精确匹配n个前面的表达式
# {n,m} 匹配n到m次由前面正则表达式定义的片段,贪婪方式
# a|b 匹配a或b
# () 匹配括号内的表达式,也表示一个组

2. match方法,传入表达式和字符串进行匹配

 1 ## match方法,传入表达式和字符串进行匹配
2 import re
3
4 content = 'I am shaobo, my number is 1383838438. regex Demo'
5 result = re.match('^I\s\D\D\s[a-zA-Z]+.*\d', content)
6 print(result)
7 # 正则匹配到的内容
8 print(result.group())
9 # 匹配到的内容所在的位置
10 print(result.span())

3. 贪婪匹配和非贪婪匹配

 1 # 贪婪匹配和非贪婪匹配
2 import re
3
4 content = 'I am shaobo, my number is 13838\n38438. regex Demo'
5 # 贪婪匹配,一直匹配到最后一个'\d',即数字字符才结束(如果遇到换行符,则结束)
6 result = re.match('^I.*\d\s(.*)\.', content)
7 # 非贪婪匹配,匹配到第一个'\d',即数字字符就结束
8 result2 = re.match('^I.*?\d', content)
9 print(content)
10 print(result.group(1))
11 print(result2.group())

4. 修饰符

 1 ## 修饰符,上个例子我们用\s匹配到了换行符,才使正则表达式可以匹配换行符后的内容,通过修饰符re.S使.包含匹配换行符
2 # re.I 使匹配对大小写不敏感
3 # re.L 做本地化识别(locale-aware)匹配
4 # re.M 多行匹配,影响^和$
5 # re.S 使.匹配包括换行在内的所有字符
6 # re.U 根据Unicode字符集解析字符,这个标志影响\w、\W、\b和\B
7 # re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
8 import re
9
10 content = 'I am shaobo, my number is 13838\n38438. regex Demo'
11 result = re.match('^I.*?\d(.*)re', content, re.S)
12 print(result.group(1))

5. 转义匹配

 1 ## 转义匹配,当内容包括'()'、'.'等字符时,可通过转义字符匹配到所看到的内容
2 import re
3
4 content = '(dmr哇)www.baidu.com'
5 result = re.match('\(.*?\)www\.baidu\.', content)
6 print(result.group())
7
8
9 # 输出内容
10 '''
11 (dmr哇)www.baidu.
12 '''

6. search方法

 1 ## search方法,match从开头开始匹配,如表达式匹配不到字符串的开头内容,则匹配失败,返回None
2 ## search方法通过扫描字符串来进行匹配,返回第一个匹配到的结果
3 import re
4
5 content = 'I am shaobo, my number is 13838\n38438. regex Demo'
6 result = re.match('my.*?\.', content, re.S)
7 result2 = re.search('my.*?\.', content, re.S)
8
9 print(result + '\n' + result2)
10
11
12 # 输出内容
13 '''
14 None
15 <re.Match object; span=(13, 38), match='my number is 13838\n38438.'>
16 '''

7. findall方法

## findall方法,前面的match和search方法都是匹配到第一个符合表达式的内容,findall方法可以把所有符合表达式的内容都提取出来
import re html = '''
<h2 clall="title">经典老歌</h2>
<ul>
<li data="1">沧海一声笑</li>
<li data="2">光辉岁月</li>
<li data="3">但愿人长久</li>
<li data="4">丁香花</li>
</u>
'''
result = re.findall('<li.*?=(.*?)>(.*?)</li>', html, re.S)
print(result)
for item in result:
print(item[0], item[1]) # 输出内容
'''
[('"1"', '沧海一声笑'), ('"2"', '光辉岁月'), ('"3"', '但愿人长久'), ('"4"', '丁香花')]
"1" 沧海一声笑
"2" 光辉岁月
"3" 但愿人长久
"4" 丁香花
'''

8. sub方法

## sub方法,匹配内容进行修改
import re content = '2dlfiwe3lk59lk388ji'
result = re.sub('\d+', '', content)
print(result) # 输出内容
'''
dlfiwelklkji
'''

9. compile方法

 1 ## compile方法,将正则表达式编译成对象,从而进行复用
2 import re
3
4 time1 = '2020-3-12 12:23'
5 time2 = '2020-2-12 19:53'
6 time3 = '2020-9-12 11:03'
7 c = re.compile('\d{2}:\d{2}')
8 result1 = re.sub(c, '', time1)
9 result2 = re.sub(c, '', time2)
10 result3 = re.search(c, time2)
11 print(result1, result2, result3.group())
12
13
14 # 输出内容
15 '''
16 2020-3-12 2020-2-12 19:53
17 '''

10. 用正则表达式提取豆瓣电影top250

 1 ## 用正则表达式提取豆瓣电影top250
2 import requests, re, json, time
3
4
5 def get_page(url):
6
7 headers = {
8 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
9 }
10 response = requests.get(url=url, headers=headers)
11 if response.status_code == 200:
12 return response.text
13 else:
14 exit("访问页面失败")
15
16
17 def parser_page(html):
18 pattern = re.compile(
19 '<div class="item.*?<img.*?src="(.*?)".*?<a href="(.*?)".*?title">(.*?)</span>.*?<p class.*?:(.*?)&nbsp.*?:(.*?)<.*?(\d.*?)&.*?/.*?;(.*?)&.*?/.*?;(.*?)\n.*?pro.*?>(.*?)<.*?in.*?>(.*?)<', re.S)
20 items = re.findall(pattern, html)
21
22 for item in items:
23 yield {
24 'img': item[0],
25 'details': item[1],
26 'name':item[2],
27 'director':item[3],
28 'actor':item[4],
29 'time':item[5],
30 'nation':item[6],
31 'type':item[7],
32 'score':item[8],
33 'introduction':item[9],
34 }
35 return items
36
37 def save_file(data):
38 with open('doubanTOP250.txt', 'a', encoding='utf-8') as f:
39 f.write(json.dumps(data, ensure_ascii=False) + '\n')
40
41 def main(start):
42 url = 'https://movie.douban.com/top250?start=' + str(start)
43 html = get_page(url)
44 data = parser_page(html)
45 for item in data:
46 print(item)
47 save_file(item)
48
49
50 if __name__ == '__main__':
51 for i in range(10):
52 start = i * 25
53 main(start)

python爬虫之正则表达式(用在其他地方也可)的更多相关文章

  1. 玩转python爬虫之正则表达式

    玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...

  2. 【Python爬虫】正则表达式与re模块

    正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...

  3. python 爬虫之-- 正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 正则表达式非python独有,python 提供了正则表达式的接口,re模块 一.正则匹配字符简介 模式 描述 \d ...

  4. python爬虫训练——正则表达式+BeautifulSoup爬图片

    这次练习爬 传送门 这贴吧里的美食图片. 如果通过img标签和class属性的话,用BeautifulSoup能很简单的解决,但是这次用一下正则表达式,我这也是参考了该博主的博文:传送门 所有图片的s ...

  5. 【python爬虫和正则表达式】爬取表格中的的二级链接

    开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...

  6. Python爬虫运用正则表达式

    我看到最近几部电影很火,查了一下猫眼电影上的数据,发现还有个榜单,里面有各种经典和热映电影的排行榜,然后我觉得电影封面图还挺好看的,想着一张一张下载真是费时费力,于是突发奇想,好像可以用一下最近学的东 ...

  7. Python爬虫之正则表达式(3)

    # re.sub # 替换字符串中每一个匹配的子串后返回替换后的字符串 import re content = 'Extra strings Hello 1234567 World_This is a ...

  8. Python爬虫之正则表达式(1)

    廖雪峰正则表达式学习笔记 1:用\d可以匹配一个数字:用\w可以匹配一个字母或数字: '00\d' 可以匹配‘007’,但是无法匹配‘00A’; ‘\d\d\d’可以匹配‘010’: ‘\w\w\d’ ...

  9. python爬虫之正则表达式

    一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念 ...

随机推荐

  1. 【二食堂】Alpha - Scrum Meeting 11

    Scrum Meeting 11 例会时间:4.21 18:00~18:20 进度情况 组员 进度 今日任务 李健 1. 登录注册页面前后端对接issue 1. 登录注册页面前后端对接issue2. ...

  2. 在浏览器上开发GO和Vue!(基于code-server)

    在浏览器上开发GO和Vue!(基于code-server) 曾几何时,开发者们都被安装编程环境苦恼,尽管现在很多语言的开发环境已经不难装了,但是如果我们能有一个运行在云端的编译器,那么我们就可以随时随 ...

  3. Noip模拟29(瞎眼忌) 2021.8.3

    T1 最长不下降子序列 在此记录自己的瞎眼... 考场上像一个傻$der$,自己为了防范上升序列和不下降序列的不同特意的造了一组$hack$数据来卡自己:(第一行是序列长度,第二行是序列) 6 1 5 ...

  4. 【做题记录】 [JLOI2011]不等式组

    P5482 [JLOI2011]不等式组 超烦人的细节题!(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线). 树状数组的下标是:所有可能出现的数据进行离散化之后的值. 其含义为 ...

  5. 算法:杨辉三角(Pascal's Triangle)

    一.杨辉三角介绍 杨辉三角形,又称帕斯卡三角形.贾宪三角形.海亚姆三角形.巴斯卡三角形,是二项式系数的一种写法,形似三角形,在中国首现于南宋杨辉的<详解九章算法>得名,书中杨辉说明是引自贾 ...

  6. Python pylint requires Python '>=3.4.*' but the running Python is 2.7.12

    用pylint 1.9.x 安装 pip install pylint==1.9.3. 或者换源 pip install -i https://pypi.tuna.tsinghua.edu.cn/si ...

  7. single-number leetcode C++

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...

  8. vue中element-ui table列名lable换行问题 ---亲测

    1.lable操作 :label = "'xxxxx \n xxxxx'" // 注意 lable 的: 注:双引号内有单引号,这样才可以解析文本.需要换行的文本处添加 \n 2. ...

  9. httprunner3源码解读(1)简单介绍源码模块内容

    前言 最近想着搭建一个API测试平台,基础的注册登录功能已经完成,就差测试框架的选型,最后还是选择了httprunner,github上已经有很多开源的httprunner测试平台,但是看了下都是基于 ...

  10. 深入探索 Linux listen() 函数 backlog 的含义

    1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...