scala怎么检索某个字符_第五章 正则:通吃一切字符串处理

2c0e001b64853eddeca52a7488bf13b7.png

简介

正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

安装

内置引擎 无需安装

知识

正则基础

re模块处理字符串与系统内置str类型的函数的区别:

re模块可以用规则表达式表示多个参数,同时处理,而且功能更强大 str里边的一些函数只能一个个参数处理,比较繁琐,功能上没有re强大

一般字符

110f5fa2c54315962df9811bf8e66904.png

预定义字符

fef4dbea12e4919926cd09e1d4504fc1.png

数量匹配

5d6d3492e3da239a8e33852f56a49a96.png

边界匹配

0abfccb14918687fb23fda53b600545f.png

逻辑分组

8b65c3324bd94441171f36d11b1e2f4f.png

正则函数

1.re.match函数-startswith

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法:re.match(pattern, string, flags=0)

2. re.search函数-find

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:re.search(pattern, string, flags=0)

re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

3.re.findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:findall(string[, pos[, endpos]])

4.re.sub函数--replace

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:re.sub(pattern, repl, string, count=0, flags=0)

5.re.split函数-split

分割字符串,返回列表

语法: re.split(pattern, repl, string, count=0, flags=0)

正则表达式修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

4aadf6c1c2294fac7868fb35da9cd4ae.png

贪婪模式与非贪婪模式

贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配( * )

非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配( ? ); Python里数量词默认是贪婪的

测试一

import re

str = "abbbbbbc"

# 贪婪模式
# * 决定了尽可能的多匹配b
pattern = re.compile(r"ab*")
print(pattern.match(str).group())

# 非贪婪模式
# *? 决定了尽可能少匹配b,结果是a
pattern = re.compile(r"ab*?")
print(pattern.match(str).group())

测试二

import re

str = "<html>
              <div>aa</div>
              <div>bb</div>
              <div>cc</div>
          </html>"

# 贪婪模式
# 尽可能的多匹配 找到最后一个</div>为后边界
pattern = re.compile("<div>.*</div>",re.S)
print(pattern.findall(str))

# 非贪婪模式
# 尽可能的少匹配 找到第一个</div>为后边界
pattern = re.compile("<div>.*?</div>",re.S)
print(pattern.findall(str))
# 提取标签数据
for item in pattern.findall(str):
    print(re.search(">(.*?)<",item).group(1))

爬虫常用正则符号

数量:

  • * >= 0
  • + >=1
  • ? 0 or 1

匹配符号的:

  • . 统配符
  • /s(nrt空格)
  • /w(字符)
  • /d (数字)

分组符号:

()

(.*?)非贪婪模式

正则表达式分组:

分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。

分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。

提取HTML标签或属性

匹配标签之间的文本值

案例:抓取百度首页title标签间的内容

import requests
import re

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
}
html = requests.get("http://www.baidu.com",headers=headers).content.decode()
print(html)
# 匹配title标签之间的文本值 title没有任何其他属性干扰

pattern = re.compile("<title>(.*?)</title>",re.M|re.S)

print(pattern.search(html).group(1))

案例:抓取百度首页超链接标签间的内容

import requests
import re

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
}
html = requests.get("http://www.baidu.com",headers=headers).content.decode()
print(html)

# 抓取所有a标签之间的文本值
pattern = re.compile("<a .*?>(.*?)</a>",re.M|re.S)
print(pattern.findall(html))


# 抓取所有a标签且a标签class为mnav的文本值
pattern = re.compile('<a.*?class="mnav".*?>(.*?)</a>',re.M|re.S)
print(pattern.findall(html))


//a[@class="mnav"][@href]

# 抓取所有a标签的href且a标签class为mnav的文本值
pattern = re.compile('<a.*?href="(.*?)".*?class="mnav".*?>(.*?)</a>',re.M|re.S)
print(pattern.findall(html))

匹配标签的属性

案例:抓取hao123门户中部分href属性

import requests
import re

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
}
html = requests.get("https://www.hao123.com/",headers=headers).content.decode()
# 抓取所有a标签且a标签class为g-gc的href属性
pattern = re.compile('<a class="g-gc".*?href="(.*?)"')
for a in pattern.findall(html):
    print(a)

案例:抓取hao123门户中部分链接的data-title属性

import requests
import re

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
}
html = requests.get("https://www.hao123.com/",headers=headers).content.decode()

# 抓取所有a标签且a标签class为g-gc的data-title属性
pattern = re.compile('<a class="sitelink sub-site".*?data-title="(.*?)">.*?</a>',re.M|re.S)
for a in pattern.findall(html):
    print(a)

任务

爬取中超联赛新闻 http://sports.163.com/zc/

94722b2270340b5f3e4a09bc3ae46327.png

小站教育所有招聘信息 https://jobs.51job.com/all/co2847909.html#syzw

eabe0f15e091df73faa063495a974e03.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值