06 Python爬虫之Re(正则表达式)库

目录

  • 一、正则表达式的语法

    • 1.1 正则表达式的常用操作符

      • 实例:
  • 二、Re库的基本使用
    • 2.1 Re库介绍
    • 2.2 Re库主要功能函数
      • re.search(pattern,string,flags=0)
      • re.match(pattern,string,flags=0)
      • re.findall(pattern,string,flags=0)
      • re.split(pattern,string,maxsplit=0,flags=0)
      • re.finditer(pattern,string,flags=0)
      • re.sub(pattern,repl, string,count=0,flags=0)
    • 2.3 Re库的另一种等价用法
      • regex = re.compile(pattern,flags=0)
    • 2.4 正则表达式使用时的控制标记 flags
  • 三、Re库的Match对象
    • 3.1 Match对象的属性
    • 3.2 Match对象的方法
  • 四、Re库的贪婪匹配和最小匹配
    • 4.1 最小匹配

      • *. 贪婪模式
      • .*? 非贪婪模式(最小匹配)

正则表达式是用来简洁表达一组字符串的表达式

一、正则表达式的语法

1.1 正则表达式的常用操作符

操作符 说明 实例
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围 [abc]表示a、b、c,[a‐z]表示a到z单个字符
[^ ] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc* 表示ab、abc、abcc、abccc等
+ 前一个字符1次或无限次扩展 abc+ 表示abc、abcc、abccc等
? 前一个字符0次或1次扩展 abc? 表示ab、abc
| 左右表达式任意一个abc def表示abc、def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc、abbc
^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
( ) 分组标记,内部只能使用操作符 (abc)表示abc,(abc|def)表示abc、def
\d 数字,等价于[0‐9]
\D 非数字
\w 单词字符(数字/字母/下划线),等价于[A‐Za‐z0‐9_]
\W 非数字/非字母/非下划线
\s 空格/ \t / \n
\S 非空格/ 非\t / 非\n

实例:

. 任意字符(换行符除外)

表示任意单个字符

import re
s= 'abc12ab56bc'
# .: 任意字符(换行符除外)
print(re.findall(".",s))

[‘a‘, ‘d‘, ‘a‘, ‘s‘, ‘d‘, ‘a‘, ‘s‘, ‘d‘, ‘a‘, ‘s‘, ‘d‘, ‘a‘, ‘s‘, ‘f‘, ‘a‘, ‘s‘, ‘f‘, ‘\t‘]

[] 元字符(字符集)

匹配中间的字符,只要单个字符

也可以使用[a-z]表示a到z 单个字符

import re
s = "adasdasdasdasfasf\n\t"
# []: 匹配中间的字符,只要单个字符
print(re.findall("[acef]",s))

[‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘f‘, ‘a‘, ‘f‘]

[^] 反取

^对[]内的元素取反,除了[]里的字符都要

import re
s = "adasdasdasdasfasf\n\t"
# [^] : 把[]中的字符给排除.
print(re.findall("[^acef]",s))

[‘d‘, ‘s‘, ‘d‘, ‘s‘, ‘d‘, ‘s‘, ‘d‘, ‘s‘, ‘s‘, ‘\n‘, ‘\t‘]

* 对前一个字符0-无穷次扩展

: 匹配 前面的字符0-无穷个,空也会匹配

import re
s = r"abaacaaaaa"
# *: 匹配 *前面的字符0-无穷个
print(re.findall("a*",s))     # 匹配 0-无限个a,空也会匹配

[‘a‘, ‘‘, ‘aa‘, ‘‘, ‘aaaaa‘, ‘‘]

+ 对前一个字符1-无穷次扩展

+: 匹配 +前面的字符1-无穷个

import re
s = r"abaacaaaaa"
# +: 匹配 +前面的字符1-无穷个
print(re.findall("a+",s))     # 匹配 1-无限个a

[‘a‘, ‘aa‘, ‘aaaaa‘]

? 对前一个字符0或1次扩展

?: 匹配 ?前面的字符0或1次扩展

import re
s = r"abaacaaaaa"
# ?: 匹配 ?前面的字符0-1个
print(re.findall("a?",s))     # 匹配 0-1个a

[‘a‘, ‘‘, ‘a‘, ‘a‘, ‘‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘‘]

| 左右两边的字符都要

A|B: A和B都要

import re
s = 'abacad'
# A|B: A和B都要
print(re.findall('a|b', s))

[‘a‘, ‘b‘, ‘a‘, ‘a‘]

{m} 对前一个字符扩展m次

{m}: 匹配 {m}前面的字符m次

import re
s = r"abaacaaaaa"
# {m}: 匹配 前面的字符m个
print(re.findall("a{2}",s))   # 匹配 2个a

[‘aa‘, ‘aa‘, ‘aa‘]

{m,n} 对前一个字符扩展m-n次(含n)

{m,n}: 匹配 前面的的字符m-n个

import re
s = r"abaacaaaaa"
# {m,n}: 匹配 前面的的字符m-n个
print(re.findall("a{2,3}",s))   # 匹配 2、3个a

[‘aa‘, ‘aaa‘, ‘aa‘]

^ 元字符

字符串开始位置与匹配规则符合就匹配,否则不匹配

匹配字符串开头。在多行模式中匹配每一行的开头(Python3+已经失效,配合compile使用)

import re
s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了'
# ^: 匹配开头
print(re.findall("^王大炮", s))

[‘王大炮‘]

$ 元字符

字符串结束位置与匹配规则符合就匹配,否则不匹配

匹配字符串末尾,在多行模式中匹配每一行的末尾

import re
s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了'
# $: 匹配结尾
print(re.findall("打死了$", s))

[‘打死了‘]

() 只要括号内的

(): 只要括号内的

import re
s = 'abacad'
# (): 只要括号内的
print(re.findall('a(.)', s))

[‘b‘, ‘c‘, ‘d‘]

\d 匹配单个数字(0-9)

\d: 匹配单个数字

import re
s = '1#@¥23abc123 \n_def\t456'
# \d: 匹配单个数字
print(re.findall("\d",s))   # 匹配 单个数字

[‘1‘, ‘2‘, ‘3‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘]

\D 匹配单个非数字(包括\n)

\D: 匹配单个非数字

import re
s = '1#@¥23abc123 \n_def\t456'
# \D: 匹配单个非数字
print(re.findall("\D",s))   # 匹配 单个 非数字(包括\n)

[‘#‘, ‘@‘, ‘¥‘, ‘a‘, ‘b‘, ‘c‘, ‘ ‘, ‘\n‘, ‘_‘, ‘d‘, ‘e‘, ‘f‘, ‘\t‘]

\w 匹配 数字/字母/下划线

\w: 匹配 数字/字母/下划线

import re
s = '1#@¥23abc123 \n_def\t456'
# \w: 匹配 数字/字母/下划线
print(re.findall("\w",s))

[‘1‘, ‘2‘, ‘3‘, ‘a‘, ‘b‘, ‘c‘, ‘1‘, ‘2‘, ‘3‘, ‘_‘, ‘d‘, ‘e‘, ‘f‘, ‘4‘, ‘5‘, ‘6‘]

\W 匹配 非数字/非字母/非下划线

\W: 非数字/非字母/非下划线

import re
s = '1#@¥23abc123 \n_def\t456'
# \W: 非数字/非字母/非下划线
print(re.findall("\W",s))

[‘#‘, ‘@‘, ‘¥‘, ‘ ‘, ‘\n‘, ‘\t‘]

\s 匹配 空格/ \t/ \n

\s: 空格/ \t/ \n

import re
s = '1#@¥23abc123 \n_def\t456'
# \s: 空格/ \t/ \n
print(re.findall("\s", s))

[‘ ‘, ‘\n‘, ‘\t‘]

\S 匹配 非空格/ 非\t/ 非\m

\S: 非空格/ 非\t/ 非\m

import re
s = '1#@¥23abc123 \n_def\t456'
# \S: 非空格/ 非\t/ 非\m
print(re.findall("\S", s))

[‘1‘, ‘#‘, ‘@‘, ‘¥‘, ‘2‘, ‘3‘, ‘a‘, ‘b‘, ‘c‘, ‘1‘, ‘2‘, ‘3‘, ‘_‘, ‘d‘, ‘e‘, ‘f‘, ‘4‘, ‘5‘, ‘6‘]

二、Re库的基本使用

2.1 Re库介绍

Re库是Python的标准库,主要用于字符串匹配

**调用方式:import re**

2.2 Re库主要功能函数

函数 说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

re.search(pattern,string,flags=0)

在一个字符串中搜索匹配正则表达式的第一个位置 返回match对象

  • pattern : 正则表达式的字符串或原生字符串表示
  • string : 待匹配字符串
  • flags : 正则表达式使用时的控制标记

re.match(pattern,string,flags=0)

从一个字符串的开始位置起匹配正则表达式 返回match对象

  • pattern : 正则表达式的字符串或原生字符串表示
  • string : 待匹配字符串
  • flags : 正则表达式使用时的控制标记

re.findall(pattern,string,flags=0)

搜索字符串,以列表类型返回全部能匹配的子串

  • pattern : 正则表达式的字符串或原生字符串表示
  • string : 待匹配字符串
  • flags : 正则表达式使用时的控制标记

re.split(pattern,string,maxsplit=0,flags=0)

将一个字符串按照正则表达式匹配结果进行分割 返回列表类型

  • pattern : 正则表达式的字符串或原生字符串表示
  • string : 待匹配字符串
  • maxsplit: 大分割数,剩余部分作为后一个元素输出
  • flags : 正则表达式使用时的控制标记

re.finditer(pattern,string,flags=0)

搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象

  • pattern : 正则表达式的字符串或原生字符串表示
  • string : 待匹配字符串
  • flags : 正则表达式使用时的控制标记

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

在一个字符串中替换所有匹配正则表达式的子串 返回替换后的字符串

  • pattern : 正则表达式的字符串或原生字符串表示
  • repl: 替换匹配字符串的字符串
  • string : 待匹配字符串
  • count : 匹配的大替换次数
  • flags : 正则表达式使用时的控制标记

2.3 Re库的另一种等价用法

regex = re.compile(pattern,flags=0)

将正则表达式的字符串形式编译成正则表达式对象

  • pattern : 正则表达式的字符串或原生字符串表示
  • flags : 正则表达式使用时的控制标记
函数 说明
regex.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
regex.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
regex.findall() 搜索字符串,以列表类型返回全部能匹配的子串
regex.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
regex.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
regex.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

2.4 正则表达式使用时的控制标记 flags

修饰符 描述
re.I 使匹配对大小写不敏感,忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
re.L 做本地化识别(locale-aware)匹配
re.M 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

三、Re库的Match对象

Match对象是一次匹配的结果,包含匹配的很多信息

3.1 Match对象的属性

属性 说明
.string 待匹配的文本
.re 匹配时使用的patter对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

3.2 Match对象的方法

属性 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.end() 匹配字符串在原始字符串的结束位置
.span() 返回(.start(), .end())

四、Re库的贪婪匹配和最小匹配

Re库默认采用贪婪匹配,即输出匹配长的子串

4.1 最小匹配

操作符 说明
*? 前一个字符0次或无限次扩展,小匹配
+? 前一个字符1次或无限次扩展,小匹配
?? 前一个字符0次或1次扩展,小匹配
{m,n}? 扩展前一个字符m至n次(含n),小匹配

只要长度输出可能不同的,都可以通过在操作符后增加?变成小匹配

*. 贪婪模式

.*: 贪婪模式(最大化),找到继续找,让结果最大化

import re
s = 'abbbcabc'
# .*: 贪婪模式(最大化),找到继续找,让结果最大化
print(re.findall('a.*c', s))
print(re.findall('a.+c', s))

[‘abbbcabc‘]
[‘abbbcabc‘]

.*? 非贪婪模式(最小匹配)

.*?: 非贪婪模式(最小化),找到就马上停止

import re
s = 'abbbcabc'
# .*?: 非贪婪模式(最小化),找到就马上停止
print(re.findall('a.*?c', s))
print(re.findall('a.+?c', s))

[‘abbbc‘, ‘abc‘]
[‘abbbc‘, ‘abc‘]

原文地址:https://www.cnblogs.com/XuChengNotes/p/11404529.html

时间: 2024-10-10 22:26:56

06 Python爬虫之Re(正则表达式)库的相关文章

Python爬虫入门之正则表达式

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我

Python爬虫入门之Urllib库的高级用法

1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监听,示意如下,比如知乎,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般是首先请求HTML文件,然后加载JS,CSS 等等,经过多次

python爬虫入门request 常用库介绍

什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 其实通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据. 你可以爬去妹子的图片,爬取自己想看看的视频..等等你想要爬取的数据,只要你能通过浏览器访问的数据都可以通过爬虫获取 爬虫的本质 模拟浏览器打开网页,获取网页中我们想要的那部分数据 浏览器打开网页的过程

Python爬虫利器:BeautifulSoup库

Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. BeautifulSoup库是解析.遍历.维护 "标签树" 的功能库(遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问).https://www.crummy.com/software/BeautifulSoup BeautifulSoup库我们常称之为bs4,导入该库为:from bs4 im

python 爬虫入门之正则表达式 一

python  正则表达式知识点 正则 常用符号 . : 匹配任意字符,换行符除外 * : 匹配前一个字符 0 次或者无限次 ? : 匹配前一个字符 0次或者1次 .* : 贪心算法 .*? :非贪心算法 (): 括号内的数据作为结果返回 正则常用方法: findall: 匹配所有符合规律的内容,返回包含结果的列表 Search: 匹配并提取第一个符合规律的内容,返回一个正则表达式对象 Sub: 替换符合规律的内容,返回替换后的值 正则表达式的基本应用 ,使用正则表达式过滤一个简单的test文件

python爬虫笔记----4.Selenium库(自动化库)

4.Selenium库 (自动化测试工具,支持多种浏览器,爬虫主要解决js渲染的问题) pip install selenium 基本使用 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_condition

Python爬虫入门之三urllib库的基本使用

前言 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很多库可以用来抓取网页,我们先学习urllib. 注:此博客开发环境为python3 urlopen 我们先来段代码: # urllib_urlopen.py # 导入urllib.request import urllib.request # 向指定的url发送请求,并返回服务器响应的类文件对象 response = urllib.request.urlopen("http://www.bai

python爬虫二、Urllib库的基本使用

什么是Urllib Urllib是python内置的HTTP请求库 包括以下模块 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 urllib.robotparser robots.txt解析模块 urlopen 关于urllib.request.urlopen参数的介绍: urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=No

Python 爬虫4——使用正则表达式筛选内容

之前说过,使用urllib和urllib2,只是为了获取指定URL的html内容,而对内容进行解析和筛选,则需要借助python中的正则表达式来完成. 一.预备知识: 1.正则表达式简述: 什么是正则表达式?正则表达式就是可以匹配文本片段的模式,最简单的正则表达式就是一个字符串,用于在文本中匹配到此字符串自身. 2.常用正则表达式: 设计正则表达式的时候有几个注意点如下: a.特殊符号需要加转移符:如要匹配'china.com',则正则表达式格式应为'china\\.com': b.字符集(使用