Pyhton爬虫知识之正则表达式详解

目录
  • 前言
  • 1、正则表达式基础
  • 2、正则表达式的基本符号
    • 2.1 点号 “.”
    • 2.2 星号 “*”
    • 2.3 问号 “?”
    • 2.4 反斜杠 “\”
    • 2.5 数字 “\d”
    • 2.6 小括号 “()”
  • 3、Python中使用正则表达式
    • 3.1 findall
    • 3.2 serach
    • 3.3 “.* ” 和 “.*?” 的区别
  • 4、正则表达式提取技巧
    • 4.1 不需使用 compile
    • 4.2 先抓大再抓小
    • 4.3 括号内和括号外
  • 总结

前言

在爬虫的开发中,需要把有用的信息从一大段文本中提取出来,正则表达式是提取信息的方法之一。

1、正则表达式基础

正则表达式(Regular Expression)是一段字符串,它可以表示一段有规律的信息。Python自带一个正则表达式模块 - re,通过这个模块可以查找、提取、替换一段有规律的信息。在程序开发中,要让计算机程序从一大段文本中找到需要的内容,就可以使用正则表达式来实现。

使用正则表达式有如下步骤:

(1)寻找规律

(2)使用正则符号表示规律

(3)提取信息

2、正则表达式的基本符号

2.1 点号 “.”

一个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号。

2.2 星号 “*”

一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次。

2.3 问号 “?”

一个问号可以表示它前面的子表达式0次或者1次。注意,这里的问号是英文问号。

2.4 反斜杠 “\”

反斜杠在正则表达式里面不能单独使用,甚至在整个 Python 里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号:

2.5 数字 “\d”

正则表达式里面使用 “\d” 来表示一位数字。为什么要用字母d呢?因为d是英文“digital(数字)”的首字母。强调一下,“\d”虽然是由反斜杠和字母d构成的,但是要把“\d”看成一个正则表达式符号整体。

2.6 小括号 “()”

小括号可以把括号里面的内容提取出来。

3、Python中使用正则表达式

Python 已经自带了一个功能非常强大的正则表达式模块。使用这个模块可以非常方便地通过正则表达式来从一大段文字中提取有规律的信息。Python的正则表达式模块名字为“re”,也就是“regularexpression”的首字母缩写。在Python中需要首先导入这个模块再进行使用。导入的语句为:

import re # pycharm 如果报错 Alt+Enter 自动导入即可

下面我们来介绍一下常用的API:

3.1 findall

Python的正则表达式模块包含一个findall方法,它能够以列表的形式返回所有满足要求的字符串。

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.

    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)

pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。

findall 的结果是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表:

content = '我的电脑密码是:123456,我的手机密码是:888888,我的家门密码是:000000,勿忘!'

pwd_list = re.findall('是:(.*?),', content)
machine_list = re.findall('我的(.*?)密码是:', content)
name_list = re.findall('名字是(.*?),', content)
print('所有密码为:{}'.format(pwd_list))
print('所属为:{}'.format(machine_list))
print('用户姓名为:{}'.format(name_list))

结果中很明显没有匹配到结果的为空 List 。这里还有一个变化:在匹配密码的时候,如左图会少一个。原因就出在匹配上面,我的匹配规则为:'是:(.*?),',必须严格满足这个格式的文本的中间密码部分才能被提取出来,重点就是后面的 , ,如右图加上了 ,勿忘! 就使得前面的文本满足匹配规则,从而进行提取:

当需要提取某些内容的时候,使用小括号将这些内容括起来,这样才不会得到不相干的信息。如果包含多个 “(.*?)” 如下图所示,返回的仍然是一个列表,但是列表里面的元素变为了元组,元组里面的第1个元素是账号,第2个元素为密码:

函数原型中有一个flags参数。这个参数是可以省略的;当不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换行符等。这里以忽略换行符为例来进行说明:

常用的参数:

re.I
    IGNORECASE
    忽略字母大小写

re.L
    LOCALE
    影响 “w, “W, “b, 和 “B,这取决于当前的本地化设置。

re.M
    MULTILINE
    使用本标志后,‘^’和‘$’匹配行首和行尾时,会增加换行符之前和之后的位置。

re.S
    DOTALL
    使 “.” 特殊字符完全匹配任何字符,包括换行;没有这个标志, “.” 匹配除了换行符外的任何字符。

re.X
    VERBOSE
    当该标志被指定时,在 RE 字符串中的空白符被忽略,除非该空白符在字符类中或在反斜杠之后。
    它也可以允许你将注释写入 RE,这些注释会被引擎忽略;
    注释用 “#”号 来标识,不过该符号不能在字符串或反斜杠之后。

参考:Python 正则表达式 flags 参数

3.2 serach

search() 的用法和 findall() 的用法一样,但是 search() 只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。对于从超级大的文本里面只找第1个数据特别有用,可以大大提高程序的运行效率。

def search(pattern, string, flags=0):
    """Scan through string looking for a match to the pattern, returning
    a Match object, or None if no match was found."""
    return _compile(pattern, flags).search(string)

对于结果,如果匹配成功,则是一个正则表达式的对象,要得到匹配到的结果,则需要通过.group()这个方法来获取里面的值;如果没有匹配到任何数据,就是 None:

只有在.group()里面的参数为1的时候,才会把正则表达式里面的括号中的结果打印出来。
.group()的参数最大不能超过正则表达式里面括号的个数。参数为1表示读取第1个括号中的内容,参数为2表示读取第2个括号中的内容,以此类推:

3.3 “.* ” 和 “.*?” 的区别

在爬虫开发中,.*? 这3个符号大多数情况下一起使用。

  • 点号表示任意非换行符的字符,星号表示匹配它前面的字符0次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意次。
  • 这个时候必须在“.*”的前后加其他的符号来限定范围,否则得到的结果就是原来的整个字符串。
  • 如果在“.*”的后面加一个问号,变成 “.*?”,那么可以得到什么样的结果呢?问号表示匹配它前面的符号0次或者1次。于是 “.*?” 的意思就是匹配一个能满足要求的最短字符串。

使用“(.*)”得到的是只有一个元素的列表,里面是一个很长的字符串。

使用“(.*?)”得到的结果是包含3个元素的列表,每个元素直接对应原来文本中的每个密码。

总结:

①“.*”:贪婪模式,获取最长的满足条件的字符串。②“.*?”:非贪婪模式,获取最短的能满足条件的字符串。

4、正则表达式提取技巧

4.1 不需使用 compile

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.

    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)

def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a Pattern object."
    return _compile(pattern, flags)

使用re.compile()的时候,程序内部调用的是_compile()方法;当使用re.finall()的时候,在模块内部自动先调用了_compile()方法,再调用findall()方法。re.findall()自带re.compile()的功能,所以没有必要使用re.compile()。

4.2 先抓大再抓小

一些无效内容和有效内容可能具有相同的规则。这种情况下很容易把有效内容和无效内容混在一起,如下面这段文字:

有效用户:姓名: 张三姓名: 李四姓名: 王五无效用户:姓名: 不知名的小虾米姓名: 隐身的张大侠

有效用户和无效用户的名字前面都以“姓名: ”开头,如果使用“姓名: (.*?)\n”来进行匹配,就会把有效信息和无效信息混在一起,难以区分:

要解决这个问题,就需要使用先抓大再抓小的技巧。先把有效用户这个整体匹配出来,再从有效用户里面匹配出人名:

4.3 括号内和括号外

在上面的例子中,括号和“.*?”都是一起使用的,因此可能会有读者认为括号内只能有这3种字符,不能有其他普通的字符。但实际上,括号内也可以有其他字符,对匹配结果的影响结果如下:

其实不难理解,只需要记住:"按照匹配规则查找,括号内的被提取" 就可以了!

总结

到此这篇关于Pyhton爬虫知识之正则表达式的文章就介绍到这了,更多相关Pyhton爬虫正则表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 爬虫学习笔记之正则表达式

    正则表达式的使用 想要学习 Python 爬虫 , 首先需要了解一下正则表达式的使用,下面我们就来看看如何使用. . 的使用这个时候的点就相当于一个占位符,可以匹配任意一个字符,什么意思呢?看个例子就知道 import re content = "helloworld" b = re.findall('w.',content) print b` 注意了,我们首先导入了 re,这个时候大家猜一下输出结果是什么?因为 . 相当于一个占位符,所以理所当然的这个时候的输出结果是 wo . *

  • Python爬虫之正则表达式基本用法实例分析

    本文实例讲述了Python爬虫之正则表达式基本用法.分享给大家供大家参考,具体如下: 一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些匹配某个模式的文本. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表

  • python爬虫正则表达式之处理换行符

    刚开始学python,记录下问题. 代码如下: #coding:utf-8 import re,urllib2 def getHTML(url): html=urllib2.urlopen(url) html=html.read() return html if __name__=='__main__': url='https://www.baidu.com' #处理换行符以及空格 print getHTML(url).replace('\n','').replace('\t','').repl

  • python3爬虫之入门基础和正则表达式

    前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享:爬虫说的简单,就是去抓取网路的数据进行分析处理:这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式: 用python抓取指定页面: 代码如下: import urllib.request url= "http://www.baidu.com" data = urllib.request.urlopen(url).read()# d

  • 零基础写python爬虫之神器正则表达式

    接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. 一. 正则表达式基础 1.1.概念介绍 正则表达式是用于处理字符串的强大工具,它并不是Python的一部分. 其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同. 它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表达式的语法都是一样的. 下

  • python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解

    这篇博客是自己<数据挖掘与分析>课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站.希望这篇基础文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵.真的太忙了,太长时间没有写博客了,抱歉~ 一.正则表达式 正则表达式(Regular Expression,简称Regex或RE)又称为正规表示法或常规表示法,常常用来检索.替换那些符合某个模式的文本,它首先设定好了一些特殊的字及字符组合,通过组合的&

  • Python爬虫正则表达式常用符号和方法

    正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分. 1.常用符号 . :匹配任意字符,换行符 \n 除外 :匹配前一个字符0次或无限次 ? :匹配前一个字符0次或1次 .* :贪心算法,尽可能的匹配多的字符 .*? :非

  • Python的爬虫包Beautiful Soup中用正则表达式来搜索

    Beautiful Soup使用时,一般可以通过指定对应的name和attrs去搜索,特定的名字和属性,以找到所需要的部分的html代码. 但是,有时候,会遇到,对于要处理的内容中,其name或attr的值,有多种可能,尤其是符合某一规律,此时,就无法写成固定的值了. 所以,就可以借助正则表达式来解决此问题. 比如, <div class="icon_col"> <h1 class="h1user">crifan</h1> <

  • 玩转python爬虫之正则表达式

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

  • Python爬虫教程之利用正则表达式匹配网页内容

    前言 Python爬虫,除了使用大家广为使用的scrapy架构外,还有很多包能够实现一些简单的爬虫,如BeautifulSoup.Urllib.requests,在使用这些包时,有的网络因为比较复杂,比较难以找到自己想要的代码,在这个时候,如果能够使用正则表达式,将能很方便地爬取到自己想要的数据. 何为正则表达式 正则表达式是一种描述字符串排列的一种语法规则,通过该规则可以在一个大字符串中匹配出满足规则的子字符串.简单来说,就是给定了一个字符串,在字符串中找到想要的字符串,如一个电话号码,一个I

随机推荐