欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫(1)——正则表达式

程序员文章站 2022-06-24 08:57:22
原子 原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。 常见的原子类型: 1. 普通字符作为原子 2. 非打印字符作为原子 3. 通用字符作为原子 4. 原子表 元字符 元字符是正则表达式中具有一些特殊含义的字符,比如重复N此前面的字符等。 1. ".":除换行符外任意一个字 ......

原子

原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。

常见的原子类型:

  1. 普通字符作为原子
  2. 非打印字符作为原子
  3. 通用字符作为原子
  4. 原子表
#普通字符作为原子
import re
string="iloveyou"
pat="ve"
res=re.search(pat,string)
print(res)

#非打印字符作为原子,如\n \t
string='''hello
world
'''
pat="\n"
res=re.search(pat,string)
print(res)

#通用字符作为原子
'''
\w 字母、数字、下划线
\w 除字母、数字、下划线
\d 十进制
\d 除十进制
\s 空白字符
\s 除空白字符
'''
string='''hello world 123'''
pat="\d\d"
res=re.search(pat,string)
print(res)

#原子表
#[xyz]:从中任意取一个原子
#[^xyz]:除xyz的任意一个字符
string="iloveyou"
pat="i[^love]o"
res=re.search(pat,string)
print(res)

元字符

元字符是正则表达式中具有一些特殊含义的字符,比如重复n此前面的字符等。

  1. ".":除换行符外任意一个字符
  2. “^”:开始位置
  3. “$”:结束位置
  4. “*”:0\1\多次
  5. "?":0\1次
  6. “+”:1\多次
  7. [n]:恰好n次
  8. {n,}:至少n次
  9. {n,m}:至少n次,至多m次
  10. |:模式选择符或
  11. ():模式单元

模式修正符

可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

  1. i:匹配时忽略大小写
  2. m:多行匹配
  3. l:本地化识别匹配
  4. u:unicode
  5. s:让.匹配包括换行符

用法:

#模式修正符
string="python"
pat="pyt"
res=re.search(pat,string,re.i)
print(res)

贪婪模式与懒惰模式

贪婪模式的核心点就是尽可能多的匹配,而懒惰模式是尽可能少的匹配。默认贪婪模式。

懒惰模式要加?

#贪婪模式与懒惰模式
string="poythonyhjskjsa"
pat1="p.*y"#贪婪模式
pat2="p.*?y"#懒惰模式,精准
res1=re.search(pat1,string,re.i)
res2=re.search(pat2,string,re.i)
print(res1)
print(res2)

正则表达式函数

  1. match:从头开始匹配
  2. search:任何位置都可以
  3. 全局匹配函数:re.compile(pat).findall(string)

实例

  1. 匹配.com和.cn网址:

    string="<a href='http://www.baidu.com'>百度首页</a>"
    pat="[a-za-z]+://[^\s]*[.com|.cn]"
    res=re.compile(pat).findall(string)
    print(res)
  2. 匹配电话号码:

    string="afawda027-651315641s3dfs152sd"
    pat="\d{4}-\d{7}|\d{3}-\d{8}"
    res=re.compile(pat).findall(string)
    print(res)

简单爬虫的编写

import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net").read()

提取网页的电话(qq……)

import urllib.request
import re
data=urllib.request.urlopen("https://edu.csdn.net/huiyicourse/detail/1041").read().decode("utf-8")
pat="<p> 电话:(\d*?)</p>"
res=re.compile(pat).findall(data)
print(res[0])

爬取豆瓣出版社

import urllib.request
import re
data=urllib.request.urlopen("https://read.douban.com/provider/all").read().decode("utf-8")
pat='<div class="name">(.*?)</div>' #加上圆括号后可以只显示括号里的内容
res=re.compile(pat).findall(data)
with open("出版社","w") as fp:
    for i in range(len(res)):
        print(res[i])
        fp.write(res[i]+'\n')
fp.close()