php用正则表达抓取网页中文章(Python教程正则表达式学习参考使用慕课Python网络爬虫专栏教程 )
优采云 发布时间: 2022-03-15 18:01php用正则表达抓取网页中文章(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次(含),最小匹配
只要输出的长度可能不同,可以通过加?变成最小匹配在运算符之后
总结