您的位置:首页 > 编程语言 > Python开发

《Python的正则表达式的学习及一个简单案例》

2018-11-30 21:51 274 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43646791/article/details/84668488

今天目标:

这几天学习了正则表达式,在学习的过程中遇到的困难及正则的表达式。

  • 了解正则是什么及作用
  • 测试工具和查看网站
  • 匹配单个字符用什么表示
  • 匹配多个字符用什么表示
  • 匹配开头结尾用什么表示
  • re模块操作
  • re模块的高级用法
  • 贪婪和非贪婪
  • 简单爬虫-批量获取电影下载链接

1.了解正则是什么及作用
1.正则表达式概述

  • 规则表达式(一套特殊的规则)

2.正则表达式的作用:

  • 验证数据的有效性(查找)
  • 替换文本内容
  • 从字符串中提取子字符串(爬虫思想)

2.测试工具和查看网站
第一中方法:检查正则表达式是否正确
这是一个测试工具

第二中方法:
[在线正则表达式测试(http://tool.oschina.net/regex/)
3.匹配单个字符用什么表示

表达式 描述
. 匹配任意单个字符”\n“
[ ] 匹配[ ]中举例的内容
[ab] 匹配 a 或者 b
[a-z] 匹配所有的小写字母
[A-Z] 匹配所有的大写字母
[0-9] 匹配所有的数字
[a-zA-Z0-9] 匹配所以小写字母和大写字母和数字
表达式 描述
/d 匹配所有数字 等价[0-9]
/D 匹配非数字
/s 匹配空格
/S 匹配非空格
/w 匹配字母,数字,字母,下划线
/W 匹配非字母,数字,字母,下划线

3.匹配单个字符用什么表示

表达式 描述
* 表示前一个字符出现0次或者无限次
+ 表示前一个字符出现1次或者无限次
表示前一个字符出现0次或者1次(要不不出现,要不只能出现一次)
{m} 表示前一个字符,连续出现m次
{m,n} 连续出现最少m次,最多n次,m一定要小于n

4.匹配多个字符用什么表示

表达式 描述
^ 匹配以后一个字符开头

^ 有两个作用:
1.匹配以指定字符开头
^在[]外面必须以小写字母,大写字母,数字,下划线开头
2.用在 [] 内部,用于取反
[^he] 匹配不含有 h 和 e 的字符
5.re模块操作
1.re模块的作用:

  • python提供的用于正则操作的模块。
    2.re模块的使用步骤:
  • 导包 import re
  • 使用match()方法进行检测
  • 通过match方法检测
  • re.match(“正则表达式”,“要验证和检测的字符串”)
  • 举例:
  • list = re.match("[a-zA-Z]",“Hello”)
  • 取出匹配的具体内容
  • print(list.group()) 获取匹配的具体内容

6.re模块的高级用法

search() 在需要匹配的字符串中搜索要匹配的内容

  • result = re.search("\d+", “阅读次数:9999”)

知道 match 和 search的区别

  • 1.match 从需要检测.group的字符串的开头位置匹配,如果失败返回 None

  • 2.search 从需要检测的字符串中搜索满足正则的内容,有则返回match object对象

findall() 在需要匹配的字符串中查找所有满足正则的内容,返回值是列表

  • result = re.findall("\d+", “阅读次数:9999,转发次数:6666,评论次数:38”)

sub(“正则表达式”, “新的内容”, “要替换的字符串”) 字符串替换(按照正则,查找字符串并且替换为指定的内容)返回值是替换后的字符串

  • result = re.sub("\d+", “10000”, “阅读次数:9999,转发次数:6666,评论次数:38”)

split(“正则表达式”, “待拆分的字符串”) 按照正则拆分字符串,返回值是一个列表

7.贪婪和非贪婪
贪婪:

  • 贪婪:默认,表示在满足正则的情况尽可能多的取内容
    非贪婪:
  • 表示在满足正则的情况下,尽可能少的取内容
    贪婪的转变为非贪婪: 在 * ? + {} 的后面再加上 ?就可以了 举例:
    result = re.match(“aaa(\d+?)”, “aaa123456”)
    简单爬虫-批量获取电影下载链接
在这里插入代码片"""
一、定义函数获取列表页的内容页地址 get_movie_links()
1、定义列表的地址 http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html
2、打开url地址,获取数据
3、解码获取到的数据
4、使用正则得到所有的影片内容也地址

二、主函数 main

"""
import urllib.request
import re

def get_movie_links():
"""获取列表页影片信息"""
# 1、定义列表的地址
# http: // www.ygdy8.net / html / gndy / dyzz / list_23_1.html
film_list_url = "http://www.ygdy8.net/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/.......',
3ff7
'xxx影片')]
# print(url_list)

#  定义一个字典,用于保存影片信息
films_dict = {}

#  4.3 循环遍历 url_list
i = 1
for content_url,film_name  in url_list:
# 拼接内容页地址
content_url = "http://www.ygdy8.net"+content_url
# 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 取出下载地http://www.ygdy8.net址
# print(response_content_text)
result = re.search(r"bgcolor=\"#fdfddf\"><a href=\"(.*?)\">", response_content_text)
# 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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: