python编程快速上手(持续更新中…)
正则表达式概述
用来检索、和替换
正则表达式可以
测试字符串某个模式
实现按照某种规则替换文本
根据模式匹配从字符串提取一个字符串(爬虫)
正则表达式构成
正则表达式工具介绍
RegexBuddy
正则表达式使用
匹配单个字符
-
.
匹配任意单个字符(除\n) -
[]
列举,匹配[] 中列举的内容[ab] 匹配 a 或者 b
[a-z] 匹配所有的小写字母
[A-Z] 匹配大写字母
[0-9] 匹配数字
[a-zA-Z] 匹配所有的小写字母和大写字母
-
\d
匹配所有的数字 等价于 [0-9] -
\D
非数字 -
\s
空格 -
\S
非空格 -
\w
匹配 字母、数字、下划线[a-zA-Z0-9_]
-
\W
非数字、非字母、非下划线
匹配多个字符
-
*
表示前一个字符出现 0次或者 无限次 -
+
表示 前一个字符出现 1次或者 无限次 -
?
表示 前一个字符出现 0 次或者 1次 (要不不出现,要不只能出现一次) -
{m}
表示前一个字符,连续出现 m次 -
{m,n}
表示前一个字符,连续出现最少m次,最多n次m 一定要小于 n
匹配开头和结尾
^
表示 匹配 以后一个字符开头
$
表示匹配 以前一个字符结尾
re模块操作
re模块的作用: python提供的用于正则操作的模块
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果
"""
import re
# 1、导入模块
# 2、通过 match 方法,验证正则
# re.match("正则表达式", "要验证/检测的字符串")
# match() 方法如果匹配成功,返回 match object 对象
# match() 方法如果匹配失败,返回 None
# 正则字符串 要检测的内容
result = re.match("\w{4,20}@163\.com$", "hello@163.com")
# 3、判断 验证是否成功
if result:
print("匹配成功!")
# 4、如果成功,获取匹配的结果
print("匹配结果:", result.group())
else:
print("匹配失败!")
匹配分组“|”
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果
"""
import re
# 1、导入模块
# 2、通过 match 方法,验证正则
result = re.match("^[0-9]?[0-9]$|^100$", "99")
# 3、判断 验证是否成功
if result:
print("匹配成功!")
# 4、如果成功,获取匹配的结果
print("匹配结果:", result.group())
else:
print("匹配失败!")
匹配分组“()”
"""
1、导入模块
2、match() 进行匹配
3、判断匹配的结果
4、取出匹配的内容
"""
import re
# 1、导入模块
# 2、match() 进行匹配
# result = re.match("\w{4,20}@(163|126|qq|sina)\.com$", "hello@126.com")
result = re.match("(\d{3,4})-(\d{7,8})", "010-12345678")
# 3、判断匹配的结果
if result:
print("匹配成功!")
# 4、取出匹配的内容
print("匹配结果:", result.group())
print("提取区号:", result.group(1))
print("提取电话号码:", result.group(2))
else:
print("匹配失败!")
匹配分组“\”
?P 给分组起别名,别名为name1
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果
"""
import re
# 1、导入模块
# 2、通过 match 方法,验证正则
# \1 --> \ 有特殊用法
# \\ --> \
# \1 表示引用第1个分组
# result = re.match("<([a-zA-Z0-9]+)>.*</\\1>", "<html>asdbasldfj</html>")
result = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\\2></\\1>", "<html><h1>asdbj</h1></html>")
# 3、判断 验证是否成功
if result:
print("匹配成功!")
# 4、如果成功,获取匹配的结果
print("匹配结果:", result.group())
else:
print("匹配失败!")
re高级方法
1.search
#result = re.match(“hello”, “xhello@163.com”)
#result = re.search(“hello”, “xhello@163.com”)
#match 和 search的区别
#1)match 从需要检测.group的字符串的开头位置匹配,如果失败返回 None
#2)search 从需要检测的字符串中搜索满足正则的内容,有则返回match object对象
2.findall
#二、findall(“正则表达式”, “待查找的内容”) 搜索全部,返回值是个列表
#result = re.findall("\d+", “阅读次数:9999,转发次数:6666,评论次数:38”)
3.sub替换
#三、sub(“正则表达式”, “新的内容”, “要替换的字符串”) 字符串替换(按照正则,查找字符串并且替换为指定的内容)
#返回值,是替换后的字符串findall
#result = re.sub("\d+", “10000”, “阅读次数:9999,转发次数:6666,评论次数:38”)
4.split
#四、split(“正则表达式”, “待拆分的字符串”) 按照正则拆分字符串,返回值是一个列表
Python贪婪和非贪婪
- 贪婪:默认,表示在满足正则的情况尽可能多的取内容
- 非贪婪:表示在满足正则的情况下,尽可能少的取内容
- 贪婪的转变为非贪婪: 在 * ? + {} 的后面再加上 ?就可以了
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果
"""
import re
# 1、导入模块
# 2、通过 match 方法,验证正则
# 贪婪:满足正则的情况下,尽可能多的取内容 默认为贪婪模式
# 非贪婪:满足正则的情况下,尽可能少的取内容
# 把贪婪模式该为非贪婪模式,需要使用符号:? 在+ * ? {} 后面添加? 可以变成非贪婪
# result = re.match("aaa(\d+?)", "aaa123456")
str1 = """
<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">
"""
result = re.search('src=\"(.*?)\"', str1)
# 3、判断 验证是否成功
if result:
print("匹配成功!")
# 4、如果成功,获取匹配的结果
print("匹配结果:", result.group())
print("地址:",result.group(1))
else:
print("匹配失败!")
r的作用
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果
"""
import re
# 1、导入模块
# 2、通过 match 方法,验证正则
#
# \\ --> \
# r的作用 让正则中的 \ 没有特殊含义(转义) 就是代表原声的 斜杠
result = re.match(r"<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\2></\1>", "<html><h1>asdbj</h1></html>")
# 3、判断 验证是否成功
if result:
print("匹配成功!")
# 4、如果成功,获取匹配的结果
print("匹配结果:", result.group())
else:
print("匹配失败!")
简单爬虫_阳光天堂
"""
https
一、定义函数获取列表页的内容页地址 get_movie_links()
1、定义列表的地址 https://www.ygdy8.com/html/gndy/dyzz/list_23_1.html
2、打开url地址,获取数据
3、解码获取到的数据
4、使用正则得到所有的影片内容也地址
二、主函数 main
"""
import urllib.request
import re
def get_movie_links():
"""获取列表页影片信息"""
# 1、定义列表的地址
film_list_url = "https://www.ygdy8.com/html/gndy/dyzz/list_23_1.html"
# 2、打开url地址,获取数据
reponse_list = urllib.request.urlopen(film_list_url)
# 2.1 通过read()读取网络资源数据
response_list_data = reponse_list.read()
# 3、解码获取到的数据
response_list_text = response_list_data.decode("GBK")
# 4、使用正则得到所有的影片内容地址
# 4.1 使用findall() 根据正则查找所有影片对应的内容页地址
url_list = re.findall(r"<a href=\"(.*)\" class=\"ulink\">(.*)</a>", response_list_text)
# 4.2 保存地址
# url_list = [('/html/.......', 'xxx影片'),('/html/.......', 'xxx影片')]
# print(url_list)
# 定义一个字典,用于保存影片信息
films_dict = {}
# 4.3 循环遍历 url_list
i = 1
for content_url,film_name in url_list:
# 拼接内容页地址
content_url = "https://www.ygdy8.com"+content_url
# content_url = 'https://www.ygdy8.com/html/gndy/dyzz/20210920/61870.html'
# print("影片名称:%s,内容页地址:%s" % (film_name, content_url))
# 4.4 打开内容页地址
response_content = urllib.request.urlopen(content_url)
# 4.5 接收内容页数据
# 4.6 读取网络资源
response_content_data = response_content.read()
# 4.7 解码得到内容页的文本内容
response_content_text = response_content_data.decode("GBK")
# 4.8 取出下载地https://www.ygdy8.net址
# print(response_content_text)
result = re.search(r"<a target=\"_blank\" href=\"(.*?)\">", response_content_text)
# print("11111111111", result)
print(result.group(1))
# 字典
# {"xxxx影片": "xxx地址"}
films_dict[film_name] = result.group(1)
print("已经获取%d条信息" % i)
i += 1
return films_dict
def main():
""""""
films_dict = get_movie_links()
# print(films_dict)
# 把字典遍历输出
for film_name,film_link in films_dict.items():
print("%s | %s" % (film_name, film_link))
if __name__ == '__main__':
main()