欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据解析之正则

程序员文章站 2022-07-13 12:00:53
...

一、数据解析

  • 1.数据解析就是应用一定的技术手段在响应数据中获取目标数据
  • 2.常用数据解析方式:
    正则: 匹配高效, 但正则表达式书写有难度
    BS4: 解析数据速度慢, 但使用简单
    xpath: 解析速度快, 使用简单
  • 3.环境配置:

(1).正则: pip install re
(2).BS4:
pip install lxml
pip install BeautifulSoup4
(3).xpath:
pip install lxml

二、正则

1.元字符匹配

.     匹配任意字符,除了换行符

[]    用来表示一组字符,单独列出:[abc] 匹配 'a','b'或'c'

[^...]	匹配除了字符组中字符的所有字符

\d    匹配任意数字,等价于 [0-9].

\D    匹配任意非数字

\w    匹配字母数字及下划线

\W    匹配非字母数字及下划线

\s    匹配任意空白字符,等价于 [\t\n\r\f].

\S    匹配任意非空字符

2.1、字符组: 要求在一个位置匹配的字符可能出现很多种情况, 各种情况组成一个组

[0123456789]: 匹配0到9任意字符
[0-9]: 同上
[a-z]: 匹配a到z的任意小写字母
[A-Z]: 匹配A到Z的任意大写字母
[0-9a-fA-F]: 以上三种的组合, 匹配0-9任意数组或a到f之间任意字母, 不区分大小写
自定义字符组:[a3h5]  --->  代表匹配a, 3, h, 5等字符

2.2、量词:

*  		重复零次或更多次
+		重复一次或更多次
?		重复零次或一次
{n}		重复n次
{n,}	重复n次或更多次
{n,m}	重复n到m次

2.3、边界修饰符

^		匹配开始
$		匹配结尾

2.4、 分组

在正则表达式中添加(), 就形成了一个分组, 在re模块中优先匹配显示分组内容
import re
s = "<a href='www.baidu.com'>正则匹配实验</a>"
res = re.findall("href='(.*)'>", s)
print(res)

2.5、匹配模式

re.S  单行模式
re.M  多行模式	
re.I 忽略大小写

2.6、 贪婪匹配与非贪婪匹配

贪婪匹配是指: 在使用量词:  * ,  +  等时, 尽可能多的匹配内容

非贪婪匹配是指: 使用?对正则表达式进行修饰, 使量词的匹配尽可能少, 如+代表匹配1次或多次, 在?的修饰下, 只匹配1次.

2.7、re模块

1.re.findall(‘正则表达式’, ‘待匹配字符串’): 返回所有满足匹配条件的结果, 以列表形式返回
2.re.search(‘正则表达式’, ‘带匹配字符串’): 匹配到第一个就返回一个对象, 该对象使用group()进行取值, 如果为匹配到则返回None
3.re.match(‘正则表达式’, ‘待匹配字符串’): 只从字符串开始进行匹配, 如果匹配成功返回一个对象,同样使用group()进行取值, 匹配不成功返回None
4.re.compile(‘正则表达式’): 将正则表达式编译为对象, 但需要按该正则表达式匹配是可以在直接使用该对象调用以上方法即可.

# 示例:    
s = "abcabc你好"

# findall方法演示
res_findall = re.findall('a', s)
print('findall匹配结果:', res_findall)

# search方法演示, 不确定是否能匹配出结果, 不可直接使用group进行取值, 需要判断或进行异常处理
res_search = re.search("你", s)
if res:
    print('search匹配结果', res.group())
else:
    print('None')
    
# match方法演示:
res_match_1 = re.match('abc', s)
res_match_2 = re.match('bc', s)
print('res_match_1结果:', res_match_1)
print('res_match_2结果:', res_match_2)

# compile方法演示:
re_obj = re.compile('ab')
res = re_obj.findall(s)
print(res)