正则表达式元字符:

字符匹配 :

.       :除换行符以外的任意单个字符
[] :指定范围内字符
[^] :指定范围外字符

次数匹配:

*       :任意次,0,1,多次
.* :任意字符 任意次
? :至多1次或0次
+ :至少出现1次或多次
{m} :其前面字符出现m次
{m,n} :其前面字符出现至少m次,至多n次
{m,} :其前面字符出现至少m次
{,n} :其前面字符出现至多n次 

位置锚定:

^       :匹配字符串的开头
$ :匹配字符串的末尾 

分组及引用:

()      :分组,括号内模式会被记录于正则表达式引擎
后向引用 :\1 \2 \3..... 

或:

a|b     :a或者b
C|cat :C或cat
(C|c)at :Cat或cat 

转义字符:

\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个分组的子表达式 

小练习:

判断手机号码是否合法

根据手机号码一共11位并且是只以13、14、15、17、18开头的数字:
import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|17|18)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

匹配标签

import re

ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name')) #结果 :h1
print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group()) #结果 :<h1>hello</h1>

爬虫练习

import requests

import re
import json def getPage(url): response=requests.get(url)
return response.text def parsePage(s): com=re.compile('<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',re.S) ret=com.finditer(s)
for i in ret:
yield {
"id":i.group("id"),
"title":i.group("title"),
"rating_num":i.group("rating_num"),
"comment_num":i.group("comment_num"),
} def main(num): url='https://movie.douban.com/top250?start=%s&filter='%num
response_html=getPage(url)
ret=parsePage(response_html)
print(ret)
f=open("move_info7","a",encoding="utf8") for obj in ret:
print(obj)
data=json.dumps(obj,ensure_ascii=False)
f.write(data+"\n") if __name__ == '__main__':
count=0
for i in range(10):
main(count)
count+=25

豆瓣爬电影

import re
import json
from urllib.request import urlopen def getPage(url):
response = urlopen(url)
return response.read().decode('utf-8') def parsePage(s):
com = re.compile(
'<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) ret = com.finditer(s)
for i in ret:
yield {
"id": i.group("id"),
"title": i.group("title"),
"rating_num": i.group("rating_num"),
"comment_num": i.group("comment_num"),
} def main(num):
url = 'https://movie.douban.com/top250?start=%s&filter=' % num
response_html = getPage(url)
ret = parsePage(response_html)
print(ret)
f = open("move_info7", "a", encoding="utf8") for obj in ret:
print(obj)
data = str(obj)
f.write(data + "\n") count = 0
for i in range(10):
main(count)
count += 25

简化版

 

最新文章

  1. 磁盘操作系统(DOS)
  2. 另类的SQL注入方法
  3. Eclipse 无线调试(利用ADB工具)
  4. PInvoke和Marshal的姿势
  5. Oracle错误:ORA-01033
  6. java jdbc----mysql的select、insert、update、delete
  7. HDU-4611 Balls Rearrangement 循环节,模拟
  8. Java语言基础(五) Java原始数据类型的分类以及数据范围
  9. HTML5 Canvas 的事件处理---转
  10. Cows(poj 2481 树状数组)
  11. Brave Game(裸的巴什博弈)
  12. Jmeter之性能压测Stepping Thread Group 逐步增加并发数 阶梯式加压并发 (十五)
  13. Flume+Sqoop+Azkaban笔记
  14. Robot Framework 内置变量
  15. Python PEP 8 编码规范中文版
  16. Oracle导出数据中的prompt,set feedback 等是什么意思
  17. Revit API取得变量的内参名称
  18. idea自动生成serialVersionUID , serialVersionUID的作用
  19. MD5 几种方法的选择
  20. 洛谷 P1560 蜗牛的旅行

热门文章

  1. OLE/COM Object Viewer
  2. 多线程 synchronized锁定当前对象
  3. win32 寄存器
  4. c 浮点科学计数法
  5. RHEL 6.5----SCSI存储
  6. DNS正、反向解析+负载均衡+智能DNS+密钥认证
  7. Oozie的架构
  8. PHP的扩展知识
  9. android开发学习 ------- Error:Failed to open zip file.
  10. 玩ztree的一段代码