爬虫(二)正则表达式

一.正则表达式简介

1.什么是正则表达式?

正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

2.使用正则表达式的目的

给定的字符串是否符合正则表达式的过滤逻辑(“匹配”);
通过正则表达式,从文本字符串中获取我们想要的特定部分(“过滤”)。
在这里插入图片描述

二.正则表达式匹配规则

1.正则表达式匹配规则

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.正则表达式匹配规则小案例

(1)实例1

实例1.匹配所有的qq邮箱,username@qq.com,其中username必须是字母数字或者下划线,次数为2-12之间
字母,数字或者下划线:[a-zA-Z0-9_]
非单词字符:\W

import re
pattern1 = r'[a-zA-Z0-9_]{2,12}@qq\.com'
text = 'hello@qq.com 1264573798@qq.com'
pattern1Obj = re.compile(pattern1)
result = pattern1Obj.findall(text)
print(result)

在这里插入图片描述

(2)实例2

北美电话的常用格式:(eg:2703877865)
前3位:第一位是区号以2-9开头,第2位是0-8,第三位数字可以任意;
中间三位数字:第一位是交换机号,以2-9开头,后面两位任意
最后四位数字:数字不做限制

import re
pattern2 = r'\(?[2-9][0-8]\d\)?[-\.\s]?[2-9]\d{2}[-\.\s]?\d{4}'
text = '(323)4567890'
pattern2Obj = re.compile(pattern2)
result2 = pattern2Obj.findall(text)
print(result2)

在这里插入图片描述

三.re模块

1.re模块一般使步骤

  • 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
  • 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象
  • 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

2.compile函数

compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:

import re 
# 将正则表达式编译成 Pattern 对象 
pattern = re.compile(r'\d+')

3.Pattern对象

正则表达式编译成 Pattern 对象, 可以利用 pattern 的一系列方法对文本进行匹配查找了。
Pattern 对象的一些常用方法主要有:
match 方法:从起始位置开始查找,一次匹配
search 方法:从任何位置开始查找,一次匹配
findall 方法:全部匹配,返回列表
finditer 方法:全部匹配,返回迭代器
split 方法:分割字符串,返回列表
sub 方法:替换

4.match方法

match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回, 而不是查找所有匹配的结果。它的一般使用形式如下:

match(string[, pos[, endpos]])
  • string 待匹配的字符串
  • pos 字符串的起始位置, 默认值是 0
  • endpos 字符串的终点位置, 默认值是 len (字符串长度)

match对象
group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);

start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认 值为 0;

end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数 默认值为 0;

span([group]) 方法返回 (start(group), end(group))。

5.search方法

search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有 匹配的结果,它的一般使用形式如下:

search(string[, pos[, endpos]])

当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

6.findall方法与finditer方法

findall方法搜索整个字符串,获得所有匹配的结果。使用形式如下:

findall(string[, pos, [, endpos]])

finditer方法的行为跟findall的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match对象)的迭代器

7.split方法

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

split(string[, maxsplit])

maxsplit指定最大分割次数,不指定将全部分割

import re
p = re.compile(r'[\s\, \;]+'])
print p.split('a,b;;c  d')

8.sub方法

sub方法用于替换。它的使用方法如下:

sub(rep1, string[, count])
import  re
text = "本文章点赞数为100, 转发数为20"
patternObj = re.compile(r'\d+')
# 将text文本信息中符合patternObj规则的内容替换为0;
result = patternObj.sub('0' , text)
print(result)

# 需求: 匹配到的所有数值+1

def addNum(matchObj):
    """对匹配到的内容+1"""
    if matchObj:
        # 目前num时一个字符串
        num = matchObj.group()
        # 在原有基础上加1 , num时数值类型
        num = int(num) + 1
        return str(num)


def add_perfix(matchObj):
    if matchObj:
        return '1002' + matchObj.group()

result = patternObj.sub(addNum, text)
print(result)

result = patternObj.sub(add_perfix, text)
print(result)
  • repl 可以是字符串也可以是一个函数:
    1). 是字符串,使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,
    2). 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换.

  • count 用于指定最多替换次数,不指定时全部替换。

9.贪婪模式与非贪婪模式

  1. 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( .* );
    使用贪婪的数量词的正则表达式 ab* ,匹配结果: abbb。决定了尽可能多匹配 b,所以a后面所有的 b 都出现了。
  2. 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );使用非贪婪的数量词的正则表达式 ab*? ,匹配结果: a。 .*? .+?即使前面有 * ,但是 ? 决定了尽可能少匹配 b,所以没有 b。
  3. Python里数量词默认是贪婪的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值