爬虫 正则表达式,python正则表达式爬取网页

  爬虫 正则表达式,python正则表达式爬取网页

  正则表达式,也称正则表达式,是计算机科学的一个概念。正则表达式通常用于搜索和替换符合某种模式(规则)的文本。本文主要介绍Pyhton爬虫知识正则表达式的相关信息,有需要的可以参考。

  00-1010前言1、正则表达式的基础2、正则表达式的基本符号2.1点“.”2.2星号“*”2.3问号“?”2.4反斜杠“\”2.5数字“\ d”2.6括号“()”3。正则表达式3.1 findall3.2 serach3.3”。*.* "和"。*? "区别4、正则表达式提取技巧4.1不需要用compile4.2抓大再抓小4.3括号内外总结。

  

目录

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

  

前言

  正则表达式是可以表示一条正则信息的字符串。Python自带了正则表达式模块re,通过它可以找到、提取和替换一条规则的信息。在程序开发中,正则表达式可以用来使计算机程序从一大段文本中找到它们需要的东西。

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

  (1)寻找规律

  (2)规则符号用来表达规律。

  (3)提取信息

  

1、正则表达式基础

  

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

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

  

2.1 点号 “.”

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

  

2.2 星号 “*”

  问号可以代表子表达式0或1次。注意这里的问号是英文问号。

  

2.3 问号 “?”

  反斜杠不能在正则表达式中单独使用,甚至在Python中也不能。反斜杠需要与其他字符结合使用,将特殊符号转换为普通符号,将普通符号转换为特殊符号:

  

2.4 反斜杠 “\”

  正则表达式使用“\d”来表示一个数字。为什么要用字母D?因为D是英文“digital”的第一个字母。需要强调的是,“\d”是由反斜杠和字母D组成的,但是“\d”应该看作是一个完整的正则表达式符号。

  

2.5 数字 “\d”

  括号可以把括号里的内容带到取出来。.

  

2.6 小括号 “()”

  Python已经自带了一个非常强大的正则表达式模块。使用该模块通过正则表达式从大段文本中提取正则信息非常方便。Python的regularexpression模块命名为“re”,是“正则表达式”的首字母缩写。在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爬虫正则表达式内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: