常用正则表达式最强汇总(含Python代码举例讲解 爬虫实战)

大家好,我是辰哥~

本文带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式

最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析。

正则表达式语法

Python的re模块(正则表达式)提供各种正则表达式的匹配操作。在绝大多数情况下能够有效地实现对复杂字符串的分析并取出相关信息。在讲解如何实际应用正则表达式之前,先教大家学习并掌握正则表达式的基本语法(匹配规则)。

正则表达式匹配过程如下:

(1)将定义好的正则表达式和字符串进行比较。

(2)如果每一个字符串都能匹配,则成功;一旦有匹配不成功的字符则匹配失败。

正则表达式规则

常见规则

语法

说明

实例

完整匹配

\

转义符

a\\c

a\c

.

通配符,匹配任意除换行符外的字符

a.c

abc

[…]

字符集,对应位置是字符集中任意字符

a[bcd]ef

abef

acefadef

\d

[0-9],表示一位数字

a\dc

a4c

\D

[^0-9],非数字

a\Dc

adc

\w

[0-9a-zA-Z_]。表示数字、大小写字母和下划线

a\wc

a3c

abc

\W

[^0-9a-zA-Z_],非单词字符

a\Wc

a c

\s

[\t\v\r\f]。表示空白符,包括空格、制表符、换行符、回车符、换行符

a\sc

a c

\S

[^\t\v\r\f],非空白符

a\Sc

abc

数量词匹配规则

语法

说明

实例

完整匹配

*

前一个字符0次或无限次

abcd*

abc

abcddddd

+

前一个字符1次或无限次

abcd+

abcd

Abcddddd

?

前一个字符0次或1次

abcd?

abc

abcd

{m}

前一个字符m次

abc{3}d

abcccd

{m,n}

前一个字符m至n次

abc{1,2}d

abcd

abccd

边界匹配规则

语法

说明

实例

完整匹配

^

匹配字符串开头

^ab

ab

$

匹配字符串末尾

ab$

ab

\A

仅匹配字符串开头

\Aab

ab

\Z

仅匹配字符串末尾

ab\Z

ab

Re模块

Python中使用Re库去定义的正则表达式,常用的方法列举如下:

lpattern对象

re.compile(string[,flag])

l匹配所用函数

re.match(pattern, string[, flags])

re.search(pattern, string[, flags])

re.split(pattern, string[, maxsplit])

re.findall(pattern, string[, flags])

re.finditer(pattern, string[, flags])

re.sub(pattern, repl, string[, count])

re.subn(pattern, repl, string[, count])

其中pattern对象是由我们传入字符串对象,通过compile方法生成。利用这个对象来进行下一步的匹配。针对上述列举的各种正则表达式匹配规则和函数,下面通过Python代码进行举例讲解。

(1) re.match(pattern, string[, flags])

match函数将会从String(待匹配的字符串)的开头开始,尝试匹配pattern,一直向后匹配。如果中途匹配pattern成功,则终止匹配,返回匹配结果。如果无法匹配或者到字符串末尾还未匹配到,则返回None。

举例

#导入re模块
import re
pattern = re.compile(r'python')
# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None
result1 = re.match(pattern,'python')
result2 = re.match(pattern,'pythonn CQC!')
result3 = re.match(pattern,'pthon CQC!')
print(result1)
print(result2)
print(result3)

'''
结果:
<_sre.SRE_Match object; span=(0, 6), match='python'>
<_sre.SRE_Match object; span=(0, 6), match='python'>
None
'''

(2)re.search(pattern, string[, flags])

Search函数会扫描整个string字符串查找匹配,存在的话返回匹配结果,不存在则返回None。

举例:

import repattern = re.compile(r'python')#从“hello pythonnnnn!”中匹配“python”result1 = re.search(pattern,'hello pythonnnnn!')#从“hello pyhon!”中匹配“python”result2 = re.search(pattern,'hello pyhon!')print(result1)print(result2)

'''结果:<_sre.SRE_Match object; span=(6, 12), match='python'>None'''

(3)re.split(pattern, string[, maxsplit])

split函数可以按照pattern匹配模式将string字符串分割后返回列表,其中maxsplit参数可以指定最大分割次数,不指定则将字符串全部分割。

举例:

import re
#以一位或者多位数字作为分割间隔
pattern = re.compile(r'\d+')
print(re.split(pattern,'python1java2php3js'))
#只分割两次
print(re.split(pattern,'python1java2php3js',maxsplit=2))

'''
结果:
['python', 'java', 'php', 'js']
['python', 'java', 'php3js']
'''

(4)re.findall(pattern, string[, flags])

findall函数作用是搜索整个字符串,以列表形式返回全部能匹配的子串。

举例:

import repattern = re.compile(r'\d+')print(re.findall(pattern,'python1java2php3js2245'))

'''结果:['1', '2', '3', '2245']'''

(5)re.finditer(pattern, string[, flags])

finditer函数作用是搜索整个字符串,返回一个符合匹配结果(Match对象)的迭代器。

举例:

import re
#以一位或者多位数字作为搜索条件
pattern = re.compile(r'\d+')
#搜索结果得到一个集合,通过循环对集合遍历输出
for item in re.finditer(pattern,'python1java2php3js2245'):
  print(item.group())

'''
结果:
1
2
3
2245
'''

(6)re.sub(pattern, repl, string[, count])

先看两个例子,然后再解释这个sub函数的作用。

举例:

import repattern1 = re.compile(r'music')#例1中“i love the music”里的music替换成pythonprint(re.sub(pattern1, 'python', 'i love the music'))pattern2 = re.compile(r'(\d+)')#例2中“数字123 和9”被python替换。print(re.sub(pattern2, 'python', 'My number is 123 and my favorite number is 9'))

'''结果:i love the pythonMy number is python and my favorite number is python'''

(7)re.subn(pattern, repl, string[, count])

subn可以指定替换次数,不指定则默认替换全部。

举例:

import re
#以一位或者多位数字作为替换条件
pattern1 = re.compile(r'(\d+)')
#用“python”替换数字(一位或者多位),最后返回替换结果和替换次数
print(re.subn(pattern1, 'python', 'My number is 123 and my favorite number is 9'))
pattern2 = re.compile(r'(\d+)')
print(re.subn(pattern2, 'python', 'My number is 123 and my favorite number is 9',1))

'''
结果:
('My number is python and my favorite number is python', 2)
('My number is python and my favorite number is 9', 1)
'''

实战

需求:提取小说章节正文和标题

本节通过实战案例来讲解正则表达式的应用。案例目的是:提取小说章节内容。步骤是先采集到每一章小说正文内容网页源码,然后通过正则表达式将里面的正文提取出来。

这里爬取小说  第一章 北灵院,用正则表达式提取小说章节正文标题

目标链接:http://book.chenlove.cn/book/12242/39a44ff6dd27f.html

页面如下:

分析网页源码:

可以看到章节标题在h3标签中,其class为j_chapterName;正文内容在p标签中,清楚这些之后,下面开始编写代码请求网页源码,并编写正则表达式去提取标题和正文。

完整代码如下:

import requestsimport reimport json# 设置代理服务器headers = {    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}#请求连接url = 'http://book.chenlove.cn/book/12242/39a44ff6dd27f.html'response = requests.get(url, headers=headers)if response.status_code == 200:    # 转化为utf-8格式,不加这条语句,输出爬取的信息为乱码    response.encoding = 'utf8'    #获取到源码    html = response.text    # 正则表达式解析小说章节标题    pattern1 = re.compile('<h3>(.+)</h3>')    title = re.findall(pattern1, html)[0]    #正则表达式解析小说章节正文内容    text = re.findall(r'<p>(.*?)</p>', html,re.S)[2:-1][0].split('</div>')[0]    # 打印输出    print(title)    print(text)

'''结果:第一章 北灵院     烈日如炎,灼热的阳光从天空上倾洒下来,令得整片大地都是处于一片蒸腾之中,杨柳微垂,......'''

可以看到第一章的标题和正文已经成功提取出来了,因为正文内容很长,这里仅展示部分。

最后

本文汇总正则表达式常用的基本语法,并结合Python进行举例演示

最后实战讲解正则表达式在爬虫中的应用。

小白逆袭的数据分析成长指南2021-08-21

推荐一个超硬核Python数据科学自学平台2021-08-24

Python对系统数据进行采集监控——psutil2021-08-19

不写代码,拖拖拽拽也可使用Matplotlib/Seaborn可视化?2021-08-22

最后给大家推荐辰哥的搭建的可视化平台

(show.chenlove.cn)

导入数据一键生成可视化图表

(0)

相关推荐

  • (4条消息) python中import re

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

  • 爬虫入门教程 —— 3

    常用的数据提取工具: 1  xpath   2  BeautifulSoup  3 正则表达式   . 当然了 还有一些 像jsonpath,pyquery等 为什么要用这些解析工具? 怎么使用?(下 ...

  • 爬虫必备网页解析库——BeautifulSoup详解汇总(含Python代码举例讲解 爬虫实战)

    大家好,我是辰哥 本文带大家学习网页解析库BeautifulSoup, 并通过python代码举例讲解常用的BeautifulSoup用法 最后实战爬取小说网页:重点在于爬取的网页通过Beautifu ...

  • 常用正则表达式最强整理(速查手册)

    程序员涨点薪吧 今天 一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1- ...

  • 数理统计必备常用统计计量计算方法汇总及Python实现

    内容介绍 数据样本是可以从一个域或进程生成的所有可能的观测的更广泛的总体中获得的快照. 有趣的是,许多观测符合一个共同的模式或分布称为正态分布,或更正式,高斯分布.人们对高斯分布有很多了解,因此,统计 ...

  • 小学英语中常见常用的高频单词汇总|含例句...

    小学英语中常见常用的高频单词汇总|含例句(共215个) 这是一份精心整理的小学英语学习过程中最常见的一些单词及其例句,建议宝爸.宝妈们一定要记住为孩子收藏保存起来,以后肯定是用得到的.每一个单词及其对 ...

  • 30 个Python代码实现的常用功能,精心整理版

    源 / python     文 /艾里艾兰 1.冒泡排序 2.计算x的n次方的方法 3.计算a*a + b*b + c*c + -- 4.计算阶乘 n! 5.列出当前目录下的所有文件和目录名 6.把 ...

  • 200个文件6秒,Excel文件汇总方法大全(含Python),源码全部分享!

    再过两个月就要到年终了,转眼一年过去了!在假期来临之前,想必大家又要开始各种汇总数据了,所以我们出一期Excel多文件汇总方法大全!希望能帮助到大家!源码全部分享! 代码都是刚写的,热乎--,让我们来 ...

  • 常用免费DEM数据汇总(含下载使用方法)

    本篇文章介绍几个免费的DEM,分辨率有1km.90m.30m.12.5m,不是说分辨率越高越好,这得看应用场景的每个数据还是分数据简介.网站链接.下载方法.使用方法4个方面说明 一.全球海陆数据库1. ...

  • python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  • 太强了,1行python代码干了妹子一天的工作

    事情是这样的,元旦前有朋友向我寻求帮助,吐槽老板在放假前给他安排一个苦逼的差事,想问问我能不能帮个忙,要不然假期都过不好了 工作具体内容如下,主要是想把一个二维表格转成一维表格,如下图(表格为替代品) ...