热门标签 | 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;



推荐阅读
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • PHP 中 preg_match 函数的 isU 修饰符详解
    本文详细解析 PHP 中 preg_match 函数中 isU 修饰符的具体含义及其应用场景,帮助开发者更好地理解和使用正则表达式。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • Python第三方库安装的多种途径及注意事项
    本文详细介绍了Python第三方库的几种常见安装方法,包括使用pip命令、集成开发环境(如Anaconda)以及手动文件安装,并提供了每种方法的具体操作步骤和适用场景。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • Java 中重写与重载的区别
    本文详细解析了 Java 编程语言中重写(Override)和重载(Overload)的概念及其主要区别,帮助开发者更好地理解和应用这两种多态性机制。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • Google排名优化-面向Google(Search Engine Friendly)的URL设计 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文介绍下,在php编程中,用正则表达式判断某一字符串是否为域名的方法,有需要的朋友参考下吧。通常匹配域名的格式要求:1、域 ... [详细]
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社区 版权所有