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

python知识点总结(三)

2018-12-17 23:34 417 查看

python知识点总结(三)

本文主要总结以下python知识点(共三篇文章,这是第三篇)

  • 正则表达式
  • python之简单爬虫

 

python正则表达式

首先谈一下自己对正则表达式的理解,正则表达式是非常强大的,几乎能解决任何字符匹配问题,把你想找的东西表达成一个正则表达式,之后就能返回所以匹配的内容。字符串也有endwith、startwith等方法,不过功能太过简单,想学爬虫第一课必须是先学会正则表达式,其实不要把正则表达式看的太难,其实非常容易,把你想找的转换为计算机能听懂的语言,让计算机帮你找。

正则匹配模式

[code]^	匹配字符串的开头
$	匹配字符串的末尾。
.	匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]	用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]	不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*	匹配0个或多个的表达式。
re+	匹配1个或多个的表达式。
re?	匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}
re{ n,}	精确匹配n个前面表达式。
re{ n, m}	匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b	匹配a或b
(re)	G匹配括号内的表达式,也表示一个组
(?imx)	正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)	正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)	类似 (...), 但是不表示一个组
(?imx: re)	在括号中使用i, m, 或 x 可选标志
(?-imx: re)	在括号中不使用i, m, 或 x 可选标志
(?#...)	注释.
(?= re)	前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)	前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)	匹配的独立模式,省去回溯。
\w	匹配字母数字及下划线
\W	匹配非字母数字及下划线
\s	匹配任意空白字符,等价于 [\t\n\r\f].
\S	匹配任意非空字符
\d	匹配任意数字,等价于 [0-9].
\D	匹配任意非数字
\A	匹配字符串开始
\Z	匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z	匹配字符串结束
\G	匹配最后匹配完成的位置。
\b	匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B	匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等.	匹配一个换行符。匹配一个制表符。等
\1...\9	匹配第n个分组的子表达式。
\10	匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

处理函数

方法/属性 作用
match() 决定 RE 是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个 RE 匹配的位置
findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

match() 函数只检查 RE 是否在字符串开始处匹配,而 search() 则是扫描整个字符串。

match() 只报告一次成功的匹配,它将从 0 处开始;如果匹配不是从 0 开始的,match() 将不会报告它。

search() 将扫描整个字符串,并报告它找到的第一个匹配。

match()、seerch()、finditer()如果匹配成功则返回一个Match Object对象,该对象有以下属性、方法:

方法/属性 作用
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置

 正则可选标记

正则实例

 

贪婪模式:ab*查找abbbbc得到abbbb

非贪婪模式:ab*?查找abbbbc得到ab
.*?表示使用非贪婪模式

python之简单爬虫

会用到网络包urllib2,下面简单写一个爬虫,爬去网页图片(正则表达式写的不是很精确,这里只是举一个例子,读者可修改成更精确的表达式),还可以下载到本地

[code]# -*- encoding=utf-8 -*-
import urllib2
import re

#打开url地址上的资源
resp = urllib2.urlopen("https://www.baidu.com")
#读取资源内容,作为bytes读取
mybytes = resp.read()
#解码bytes成为string
mystr = mybytes.decode("utf8")
#关闭资源
resp.close()
#下载
# f = open("f:/bigdata/blog.html",'wb')
# f.write(mybytes);
# f.close()

#这个正则表达式不标准,大家可以替换
listurl =re.findall(r'http:.+\.png',mybytes)
print listurl

i=0
for url in listurl:
f = open(str(i)+'.jpg','w')
req = urllib2.urlopen(url)
buf = req.read()
#f.write(buf)
i+=1
print ("over")

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: