热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php反斜杠详解_Python爬虫解析神器正则表达式如何更好运用?详解(建议收藏)...

先详细的整理一下Python中的正则表达式的相关内容。正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器。一、正则表达式基础1.

先详细的整理一下Python中的正则表达式的相关内容。正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器。

af8734dd798dd4c20988ae90a39fecb4.png

一、 正则表达式基础

1.1.概念介绍

正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。

其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。

它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表达式的语法都是一样的。

下图展示了使用正则表达式进行匹配的流程:

正则表达式的大致匹配过程是:

1.依次拿出表达式和文本中的字符比较,

2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。3.如果表达式中有量词或边界,这个过程会稍微有一些不同。

3.光理论是不够的。这里顺便送大家一套2020最新PYTHON网络爬虫从入门到实践、Python开发技术详解,《Python爬虫开发与项目实战》等学习资料,需要的小伙伴,私信“学习”即可获得!

0cb28e6539cf91124591c51472e4038c.png
241c945eb238f32738bc3c27917ba1ed.png

1.2. 数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。

贪婪模式,总是尝试匹配尽可能多的字符;

非贪婪模式则相反,总是尝试匹配尽可能少的字符。

Python里数量词默认是贪婪的。

例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。

而如果使用非贪婪的数量词"ab*?",将找到"a"。

1.3. 反斜杠的问题

与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。

假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"":

第一个和第三个用于在编程语言里将第二个和第四个转义成反斜杠,

转换成两个反斜杠后再在正则表达式里转义成一个反斜杠用来匹配反斜杠。

这样显然是非常麻烦的。

Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r""表示。

同样,匹配一个数字的"d"可以写成r"d"。

有了原生字符串,妈妈再也不用担心我的反斜杠问题~

二、 介绍re模块

2.1. Compile

Python通过re模块提供对正则表达式的支持。

使用re的一般步骤是:

Step1:先将正则表达式的字符串形式编译为Pattern实例。

Step2:然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)。

Step3:最后使用Match实例获得信息,进行其他的操作。

我们新建一个re01.py来试验一下re的应用:

代码如下:

# -*- coding: utf-8 -*- #一个简单的re实例,匹配字符串中的hello字符串 #导入re模块 import re # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串” pattern = re.compile(r'hello') # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None match1 = pattern.match('hello world!') match2 = pattern.match('helloo world!') match3 = pattern.match('helllo world!') #如果match1匹配成功 if match1: # 使用Match获得分组信息 print match1.group() else: print 'match1匹配失败!' #如果match2匹配成功 if match2: # 使用Match获得分组信息 print match2.group() else: print 'match2匹配失败!' #如果match3匹配成功 if match3: # 使用Match获得分组信息 print match3.group() else: print 'match3匹配失败!'

可以看到控制台输出了匹配的三个结果:

下面来具体看看代码中的关键方法。

★ re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。

第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。

另外,你也可以在regex字符串中指定模式,

比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。

可选值有:

re.I(全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)

re.M(全拼:MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)

re.S(全拼:DOTALL): 点任意匹配模式,改变'.'的行为

re.L(全拼:LOCALE): 使预定字符类 w W B s S 取决于当前区域设定

re.U(全拼:UNICODE): 使预定字符类 w W B s S d D 取决于unicode定义的字符属性

re.X(全拼:VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

以下两个正则表达式是等价的:

代码如下:

# -*- coding: utf-8 -*- #两个等价的re匹配,匹配一个小数 import re a = re.compile(r"""d + # the integral part . # the decimal point d * # some fractional digits""", re.X) b = re.compile(r"d+.d*") match11 = a.match('3.1415') match12 = a.match('33') match21 = b.match('3.1415') match22 = b.match('33') if match11: # 使用Match获得分组信息 print match11.group() else: print u'match11不是小数' if match12: # 使用Match获得分组信息 print match12.group() else: print u'match12不是小数' if match21: # 使用Match获得分组信息 print match21.group() else: print u'match21不是小数' if match22: # 使用Match获得分组信息 print match22.group() else: print u'match22不是小数'

re提供了众多模块方法用于完成正则表达式的功能。

这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,

但同时也无法复用编译后的Pattern对象。

这些方法将在Pattern类的实例方法部分一起介绍。

如一开始的hello实例可以简写为:

代码如下:

# -*- coding: utf-8 -*- #一个简单的re实例,匹配字符串中的hello字符串 import re m = re.match(r'hello', 'hello world!') print m.group()

2.2. Match

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

属性:

string: 匹配时使用的文本。

re: 匹配时使用的Pattern对象。

pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。

endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。

lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。

lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

方法:

group([group1, …]):

获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。

groups([default]):

以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。

groupdict([default]):

返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。

start([group]):

返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。

end([group]):

返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。

span([group]):

返回(start(group), end(group))。

expand(template):

将匹配到的分组代入template中然后返回。template中可以使用id或g、g引用分组&#xff0c;但不能使用编号0。id与g是等价的&#xff1b;但10将被认为是第10个分组&#xff0c;如果你想表达1之后是字符&#39;0&#39;&#xff0c;只能使用g<1>0。

下面来用一个py实例输出所有的内容加深理解&#xff1a;

代码如下:

# -*- coding: utf-8 -*- #一个简单的match实例 import re # 匹配如下内容&#xff1a;单词&#43;空格&#43;单词&#43;任意字符 m &#61; re.match(r&#39;(w&#43;) (w&#43;)(?P.*)&#39;, &#39;hello world!&#39;) print "m.string:", m.string print "m.re:", m.re print "m.pos:", m.pos print "m.endpos:", m.endpos print "m.lastindex:", m.lastindex print "m.lastgroup:", m.lastgroup print "m.group():", m.group() print "m.group(1,2):", m.group(1, 2) print "m.groups():", m.groups() print "m.groupdict():", m.groupdict() print "m.start(2):", m.start(2) print "m.end(2):", m.end(2) print "m.span(2):", m.span(2) print r"m.expand(r&#39;g<2> g<1>g<3>&#39;):", m.expand(r&#39;2 13&#39;) ### output ### # m.string: hello world! # m.re: <_sre.sre_pattern> # m.pos: 0 # m.endpos: 12 # m.lastindex: 3 # m.lastgroup: sign # m.group(1,2): (&#39;hello&#39;, &#39;world&#39;) # m.groups(): (&#39;hello&#39;, &#39;world&#39;, &#39;!&#39;) # m.groupdict(): {&#39;sign&#39;: &#39;!&#39;} # m.start(2): 6 # m.end(2): 11 # m.span(2): (6, 11) # m.expand(r&#39;2 13&#39;): world hello!

2.3. Pattern

Pattern对象是一个编译好的正则表达式&#xff0c;通过Pattern提供的一系列方法可以对文本进行匹配查找。

Pattern不能直接实例化&#xff0c;必须使用re.compile()进行构造&#xff0c;也就是re.compile()返回的对象。

Pattern提供了几个可读属性用于获取表达式的相关信息&#xff1a;

pattern: 编译时用的表达式字符串。

flags: 编译时用的匹配模式。数字形式。

groups: 表达式中分组的数量。

groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典&#xff0c;没有别名的组不包含在内。

可以用下面这个例子查看pattern的属性&#xff1a;

代码如下:

# -*- coding: utf-8 -*- #一个简单的pattern实例 import re p &#61; re.compile(r&#39;(w&#43;) (w&#43;)(?P.*)&#39;, re.DOTALL) print "p.pattern:", p.pattern print "p.flags:", p.flags print "p.groups:", p.groups print "p.groupindex:", p.groupindex ### output ### # p.pattern: (w&#43;) (w&#43;)(?P.*) # p.flags: 16 # p.groups: 3 # p.groupindex: {&#39;sign&#39;: 3}

最后注意&#xff1a;光理论是不够的。这里顺便送大家一套2020最新PYTHON网络爬虫从入门到实践、Python开发技术详解&#xff0c;《Python爬虫开发与项目实战》等学习资料&#xff0c;需要的小伙伴&#xff0c;私信“学习”即可获得&#xff01;

文章到此结束了&#xff0c;感谢大家的阅读&#xff0c;希望小伙伴们给个关注&#xff0c;喜欢文章的记得转发收藏奥&#xff01;



推荐阅读
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • PHP中去除换行符的多种方法及应用场景
    本文将详细介绍在PHP中去除换行符的各种方法,并结合实际应用场景进行说明。通过本文,您将了解如何根据不同操作系统的特点,选择最合适的换行符处理方式。 ... [详细]
  • 深入解析Nginx中的Location指令及其属性
    本文将详细探讨Nginx配置文件中关键的location指令,包括其三种匹配方式(精准匹配、普通匹配和正则匹配),以及如何在实际应用中灵活运用这些匹配规则。此外,还将介绍location下的重要子元素如root、alias和proxy_pass,并解释相关参数的使用方法。 ... [详细]
author-avatar
mySi2502876237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有