正则表达式

  • 概述
  • 原子
  • 元字符
  • 模式修正符
  • 贪婪模式与懒惰模式
  • 正则表达式实例

概述

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

原子

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

元字符

元字符就是正则表达式中具有一些特殊含义的字符。

字符 描述
\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}

n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

.

匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。

(pattern)

匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)

正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
x|y

匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[xyz]

字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz]

负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\cx

匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\d

匹配一个数字字符。等价于 [0-9]。

\D

匹配一个非数字字符。等价于 [^0-9]。

\f

匹配一个换页符。等价于 \x0c 和 \cL。

\n

匹配一个换行符。等价于 \x0a 和 \cJ。

\r

匹配一个回车符。等价于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t

匹配一个制表符。等价于 \x09 和 \cI。

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w

匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。

\W

匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。

\num

匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\n

标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm

标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml

如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

模式修正符

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

模式修正符 说明
i 表示在和模式进行匹配进不区分大小写
m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
x 表示模式中的空白忽略不计
e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用
A 以模式字符串开头,相当于元字符^
Z 以模式字符串结尾,相当于元字符$
U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式

贪婪模式与懒惰模式

贪婪模式:尽可能多的匹配
懒惰模式:尽可能少的匹配

正则表达式实例

匹配.com和.cn的网址

import re
string = '<a href="http://www.baidu.com">百度</a>'
result = re.findall(r'[a-zA-Z]+://[^\s]*[.com|.cn]', string)

提取豆瓣阅读中的出版社

# !/usr/bin/env python
# —*— coding: utf-8 —*—
# @Time:    2020/2/7 17:27
# @Author:  Martin
# @File:    douban_read.py
# @Software:PyCharm
import re
import requestsurl = 'https://read.douban.com/provider/all'
# 请求头部伪装
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
response = requests.get(url, headers=headers)
text = response.text
# 正则表达式匹配
result_list = re.findall(r'<div class="name">(.*?)</div>', text, re.DOTALL)
# 输出结果
for result in result_list:print(result)

结果如下所示:

安徽文艺出版社
博集天卷
百花洲文艺出版社
北京阅览文化传播有限公司
白马时光
八光分文化
重庆大学出版社
读客文化
电子工业出版社
第一财经周刊
巴别塔文化
大星文化
凤凰壹力
凤凰联动
Fiberead
果麦文化
广西师范大学出版社(上海)有限公司
杭州蓝狮子文化创意股份有限公司
后浪出版公司
华东师范大学出版社
华章数媒
汉唐阳光
华章同人
虹膜出版
化学工业出版社
HarperCollins
HarperCollins UK
湖南文艺出版社
湖南科学技术出版社
今古传奇
江苏人民出版社
江苏凤凰文艺出版社
科幻世界
酷威文化
理想国
联合读创
领读文化
磨铁数盟
浦睿文化
Parkstone
清华大学出版社
青岛出版社
人民文学出版社
人民邮电出版社
人民东方出版传媒
上海九久读书人
世纪文景
四川数字出版传媒有限公司
上海译文出版社
上海雅众文化
上海社会科学院出版社
社会科学文献出版社
山西春秋电子音像出版社
陕西人民出版北京分公司
《书城》杂志
世界图书出版公司北京公司
上海文艺出版社
上海人民出版社
上海交通大学出版社
斯坦威图书
上海音乐出版社
图灵社区
未读
新星出版社
雪球
悬疑世界
新华出版社
新经典文化电子书
译林出版社
译言·东西文库
译言·古登堡计划
阳光博客
悦读名品
阅文集团华文天下
中信出版社
中国人民大学出版社
中作华文
中国轻工业出版社
紫图图书
浙版数媒
中国经济出版社
中国民主法制出版社
浙江大学出版社
湛庐文化
浙江文艺出版社
中华书局
中联百文
中国图书进出口(集团)总公司

网络爬虫之正则表达式相关推荐

  1. 转载自android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)

    转载自http://blog.csdn.net/sac761/article/details/48379173 android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式) 标签: ...

  2. Python网络爬虫和正则表达式学习总结

    阅读目录 1.利用urllib2对指定的URL抓取网页内容 2. 使用正则表达式过滤抓取到的网页信息 2.1 正则表达式介绍 2.2 Python的re模块 2.3 Python正则表达式汇总 以前在 ...

  3. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

  4. 2.06_Python网络爬虫_正则表达式

    一:爬虫的四个主要步骤 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (过滤和匹配我们需要的数据,去掉没用的数据) 处理数据(按照我们想要的方式存储和使 ...

  5. 网络爬虫--9.正则表达式

    文章目录 一. 正则表达式 1.为什么要学正则表达式 2.什么是正则表达式 3.正则表达式匹配规则 二. Python 的 re 模块 1.re 模块的一般使用步骤 2.compile 函数 3.ma ...

  6. Python网络爬虫进阶+正则表达式

    1 HTML基础 1.1 HTML结构 1.2 HTML各标签结构 1.3 HTML样式 2.正则表达式 2.1 元字符 2.1.1 元字符之. ^ $ * + ? { } 2.1.2 元字符之字符集 ...

  7. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  9. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  10. Python 网络爬虫笔记6 -- 正则表达式

    Python 网络爬虫笔记6 – 正则表达式 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Python网 ...

最新文章

  1. 管理已“死”,经营为王时代来临
  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂
  3. c++ 输出二进制_Python之输入输出(input_output)
  4. 科大星云诗社动态20210306
  5. SQL Server--[转]SQL Server中临时表与表变量的区别
  6. 牛客假日团队赛2 A.买一送一
  7. github操作命令
  8. 部分 DNS 查询因闰秒 bug 报错
  9. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效
  10. Jupyter notebook文件默认存储路径以及更改方法
  11. read()/write()的生命旅程——前言与目录
  12. OpenStack报错:MessagingTimeout: Timed out waiting for a reply to message ID
  13. ei计算机相关 小木从,怀念楼讲心那棵小木钩瞒
  14. 云栖大会 mysql_【资料合集】2018云栖大会•深圳峰会回顾:PDF下载
  15. 用python画盒图_[519]matplotlib(四)|Python中用matplotlib绘制盒状图(Boxplots)和小提琴图(Violinplots)...
  16. C++实现空间中两个三角形位置关系(相交、平行)的判断
  17. 如何使用Win10搭建我的世界Minecraft服务器
  18. 大陆证券(期货)交易所手续费计算方式详解
  19. 离别的感受(转小百合)
  20. Ensemble Learning(集成学习--AdaBoost,GBDT,Xgboost等)

热门文章

  1. python实现pdf阅读器_PyQt5 从零开始制作 PDF 阅读器(一)
  2. Java 实现批量静默打印PDF文件
  3. Hi3519AV100 SDK文档解读
  4. 对链表结构体定义中的LNode,*LinkList的理解
  5. SAP License:ERP系统简介
  6. 聊聊最近的几件小事儿
  7. c语言中输出最大公约数和最小公倍数,c语言求最大公约数和最小公倍数(转)...
  8. 安卓手机如何使用第三方主题,制作专属自己喜好的主题
  9. PHP navicat数据搭建,navicat怎么建表
  10. 手机号注册获取随机验证码