php用正则表达抓取网页中文章(Python教程正则表达式学习参考使用慕课Python网络爬虫专栏教程 )

优采云 发布时间: 2022-03-15 18:01

  php用正则表达抓取网页中文章(Python教程正则表达式学习参考使用慕课Python网络爬虫专栏教程

)

  重新库和正则表达式

  版权所有:韦敬敏,华中科技大学人工智能学院模式识别与智能系统

  网络爬虫专栏链接

  文章目录

  本教程主要参考中国大学MOOCs的Python网络爬虫和信息提取,是个人学习笔记。

  在学习过程中遇到了一些问题,手动记录修改,保证所有代码都是有效的。并结合其他博客总结了一些常见问题的解决方案。

  本教程非商用,仅供学习参考。如需转载,请联系我。

  参考

  爬虫MOOC

  数据分析 MOOC

  廖雪峰的Python教程

  正则表达式的概念

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

  介绍:

  

  简洁,一行胜千言,一行就是一个特征(模式)。

  

  

  正则表达式是用来简洁地表达一组字符串的表达式;正则表达式是一个通用的字符串表达式框架;进一步说,正则表达式是字符串的一种“简洁”和“特征”,用来表达“思维的工具;正则表达式可以用来判断字符串的属性。

  正则表达式在文本处理中很常见:

  编译:将符合正则表达式语法的字符串转换为正则表达式特征。

  

  正则表达式语法

  正则表达式的常用运算符

  操作员规范示例

  .

  代表任意单个字符

  [ ]

  字符集,给单个字符的取值范围

  [abc] 表示 a 或 b 或 c,[a-z] 表示 a 到 z 单个字符

  [^]

  非字符集,给出单个字符的排除范围

  [^abc] 表示除 a 或 b 或 c 以外的单个字符

  *

  前一个字符被扩展0次或无限次

  abc* 表示 ab、abc、abcc、abccc 等。

  +

  前一个字符扩展一次或无限次

  abc+ 表示 abc、abcc、abccc 等。

  前一个字符被扩展0或1倍

  ABC?表示ab,abc

  |

  任何左或右表达式

  abc|def 表示 abc,def

  {m}

  将前一个字符展开 m 次

  ab{2}c 表示 abbc

  {m,n}

  将前一个字符 m 扩展为 n 次(含)

  ab{1,2}c 表示 abc、abbc

  ^

  匹配字符串的开头

  ^abc 表示 abc,位于字符串的开头

  $

  匹配字符串结尾

  abc$ 表示 abc,位于字符串的末尾

  ( )

  分组标签,只有 |运算符可以在里面使用

  (abc) 表示 abc,(abc|def) 表示 abc,def

  \d

  数字,相当于[0-9]

  \w

  单词字符,相当于[A-Za-z0-9_]

  相关?对于组合语法和最小匹配,直接跳到贪婪和最小匹配。

  正则表达式语法示例

  

  经典正则表达式示例

  

  正则表达式匹配IP地址

  

  Re库的基本使用

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

  import re

  原创字符串类型(原创字符串类型)。 re库使用原创字符串类型来表示正则表达式,表示为:

  

  原创字符串是一个不收录重新转义转义字符的字符串

  re库也可以使用字符串类型来表示正则表达式,但是比较麻烦,例如:

  

  建议:当正则表达式收录转义字符时使用原创字符串

  1.Re库的主要功能

  功能说明

  re.search()

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

  re.match()

  从字符串开头匹配正则表达式,返回匹配对象

  re.findall()

  搜索字符串,返回列表类型的所有匹配子字符串

  re.split()

  根据正则表达式匹配结果拆分字符串并返回列表类型

  re.finditer()

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

  re.sub()

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

  常用参数类型

  ∙模式:正则表达式的字符串或原生字符串表示

  ∙string : 要匹配的字符串

  ∙ flags : 使用正则表达式时控制标志

  常用标签说明

  re.Ire.IGNORECASE

  忽略正则表达式的大小写,[A-Z]匹配小写字符

  re.M re.MULTILINE

  正则表达式中的 ^ 运算符可以将给定字符串的每一行作为匹配项开始

  re.S re.DOTALL

  .正则表达式中的操作符可以匹配所有字符,默认匹配除换行符以外的所有字符

  ∙maxsplit:最大分割数,余数作为最后一个元素输出

  ∙repl : 替换匹配字符串的字符串

  ∙ count : 要匹配的最大替换数

  1.

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

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

  >>> import re

>>> match = re.search(r'[1-9]\d{5}', 'BIT 100081')

>>> if match:

print(match.group(0))

100081

  2.

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

  从字符串开头匹配正则表达式,返回匹配对象

  >>> import re

>>> match = re.match(r'[1-9]\d{5}', 'BIT 100081')

>>> if match:

match.group(0)

>>> match.group(0)

Traceback (most recent call last):

File "", line 1, in

match.group(0)

AttributeError: 'NoneType' object has no attribute 'group'

  >>> match = re.match(r'[1-9]\d{5}', '100081 BIT')

>>> if match:

print(match.group(0))

100081

  3.

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

  搜索字符串,返回列表类型的所有匹配子字符串

  >>> import re

>>> ls = re.findall(r'[1-9]\d{5}', 'BIT100081 TSU100084')

>>> ls

['100081', '100084']

  4.

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

  根据正则表达式匹配结果拆分字符串并返回列表类型

  >>> import re

>>> re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084')

['BIT', ' TSU', '']

>>> re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084', maxsplit=1)

['BIT', ' TSU100084']

  5.

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

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

  >>> import re

>>> for m in re.finditer(r'[1-9]\d{5}', 'BIT100081 TSU100084'):

if m:

print(m.group(0))

100081

100084

  6.

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

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

  >>> import re

>>> re.sub(r'[1-9]\d{5}', ':zipcode', 'BIT100081 TSU100084')

'BIT:zipcode TSU:zipcode'

  2.Re 库的另一种等效用法

  功能用法:一次性操作

  >>> rst = re.search(r'[1-9]\d{5}', 'BIT 100081')

  相当于

  面向对象的用法:编译后的多次操作

  >>> pat = re.compile(r'[1-9]\d{5}')

>>> rst = pat.search('BIT 100081')

>>> if rst:

print(rst.group(0))

100081

  编译:

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

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

  >>> regex = re.compile(r'[1‐9]\d{5}')

  然后调用对应的方法,注意不要再写pattern了

  

  Re 库的 Match 对象

  Match 对象是匹配的结果,收录很多关于匹配的信息

  >>> match = re.search(r'[1-9]\d{5}', 'BIT 100081')

>>> if match:

print(match.group(0))

100081

>>> type(match)

  Match 对象的属性:

  属性说明

  .字符串

  要匹配的文本

  .re

  匹配时使用的模式对象(正则表达式)

  .pos

  正则表达式搜索文本开始

  .endpos

  正则表达式搜索文本结束

  Match 对象的方法

  方法说明

  .group(0)

  获取匹配的字符串

  .start()

  匹配的字符串在原字符串的开头

  .end()

  匹配的字符串在原字符串的末尾

  .span()

  返回(.start(), .end())

  例子:

  >>> import re

>>> m = re.search(r'[1-9]\d{5}', 'BIT100081 TSU100084')

>>> m.string

'BIT100081 TSU100084'

>>> m.re

re.compile('[1-9]\\d{5}')

>>> m.pos

>>> m.endpos

19

>>> m.group(0)

'100081'

>>> m.start

>>> m.start()

3

>>> m.end()

9

>>> m.span()

(3, 9)

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

  >>> match = re.search(r'PY.*N', 'PYANBNCNDN')

>>> match.group(0)

  同时匹配多个不同长度的项目,返回哪一个?

  贪婪匹配:

  >>> match = re.search(r'PY.*N', 'PYANBNCNDN')

>>> match.group(0)

'PYANBNCNDN'

  Re库默认使用贪心匹配,即输出匹配最长的子串

  最小匹配:

  如何输出最短的子串?

  >>> match = re.search(r'PY.*?N', 'PYANBNCNDN')

>>> match.group(0)

'PYAN'

  最小匹配运算符

  运营商说明

  前一个字符扩展0或无限次,最小匹配

  前一个字符扩展 1 或无限,最小匹配

  前一个字符 0 或 1 扩展,最小匹配

  {m,n}?

  将前一个字符m扩展到n次(含),最小匹配

  只要输出的长度可能不同,可以通过加?变成最小匹配在运算符之后

  总结

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线