当前位置:   article > 正文

Python爬虫学习——数据解析之Re解析(七)_re结构化文本数据拆解python

re结构化文本数据拆解python

Python爬虫学习


前言

三种解析方式:
1、re解析(正则表达式)
2、bs4解析
3、xpath解析

一、正则表达式

正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。在表单验证、Url映射等处都会经常用到。

优点:速度快、效率高、准确性高

正则的语法:使用元字符进行排列组合匹配字符串

.常用正则表达式符号和语法:
'.' 匹配所有字符串,除\n以外
‘-’ 表示范围[0-9]

'^' 匹配字符串开头
‘$’ 匹配字符串结尾 re
'\d' 匹配数字,等于[0-9] re.findall('\d','电话:10086')结果['1', '0', '0', '8', '6']
'\D' 匹配非数字,等于[^0-9] re.findall('\D','电话:10086')结果['电', '话', ':']
'\w' 匹配字母和数字,等于[A-Za-z0-9] re.findall('\w','alex123,./;;;')结果['a', 'l', 'e', 'x', '1', '2', '3']
'\W' 匹配非英文字母和数字,等于[^A-Za-z0-9] re.findall('\W','alex123,./;;;')结果[',', '.', '/', ';', ';', ';']
'\s' 匹配空白字符 re.findall('\s','3*ds \t\n')结果[' ', '\t', '\n']
'\S' 匹配非空白字符 re.findall('\s','3*ds \t\n')结果['3', '*', 'd', 's']
'\A' 匹配字符串开头
'\Z' 匹配字符串结尾
'\b' 匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的
'\B' 与\b相反,只在当前位置不在单词边界时匹配 
'a|b'匹配a或者b
[] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
二、正则表达式量词
'\' 转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以\*或者字符集[*] re.findall(r'3\*','3*ds')结['3*']
'*' 匹配前面的字符0次或多次 re.findall("ab*","cabc3abcbbac")结果:['ab', 'ab', 'a']
'*' 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*'+' 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+?’ 匹配前一个字符串0次或1次 re.findall('ab?','abcabcabcadf')结果['ab', 'ab', 'ab', 'a']
'{m}' 匹配前一个字符m次 re.findall('cb{1}','bchbchcbfbcbb')结果['cb', 'cb']
'{n,m}' 匹配前一个字符n到m次 re.findall('cb{2,3}','bchbchcbfbcbb')结果['cbb']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

贪婪匹配和惰性匹配

.*:贪婪匹配
.*?:惰性匹配 #?含义让*尽可能少的匹配结果  类似于回溯法
  • 1
  • 2

二、Re模块

re.match(pattern, string, flags=0) 从字符串的起始位置匹配,如果起始位置匹配不成功的话,match()就返回none
re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
re.findall(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个列表返回
re.finditer(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个迭代器返回
re.sub(pattern, repl, string, count=0, flags=0) 替换匹配到的字符串
re.compile(pattern,flags=0)预加载正则表达式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
i.group()从i里面拿到内容用group()

import re
ret = re.match(".","csdn")
print(ret.group())
ret = re.match("t.o","two")
print(ret.group())
# 如果hello的⾸字符⼩写,那么正则表达式需要⼩写的h
ret = re.match("h","hello")
print(ret.group())
# 如果hello的⾸字符⼤写,那么正则表达式需要⼤写的H
ret = re.match("H","Hello")
print(ret.group())
# ⼤⼩写h都可以的情况
ret = re.match("[hH]","hello")
print(ret.group())
# 匹配09
ret = re.match("[0-9]Hello","7Hello world")
print(ret.group())
# 匹配035-9
ret = re.match("[0-35-9]Hello","2Hello")
print(ret.group())
ret = re.match("他是\d号","他是1号")
print(ret.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述
那么该怎么提取正则里面具体的内容呢

import re
a = """
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋轶</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>(?P<name>.*?)</span></div>",re.S)  #re.S 让.能匹配换行符
result = obj.finditer(a)
for it in result:
    print(it.group("name"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

通过预加载正则表达式进行匹配,可以看到打印的信息,为什么会打印这些信息呢,简单讲解一下代码,先观察上面的信息,会发现到div class='时出现了不相等的字符,从这里进行惰性匹配,最近相同的一个是’所以就有在这里插入图片描述
然后依次类推,那么怎么提取我们想要的呢,这个时候就需要用到(?P正则表达式)在这里插入图片描述
这个就是将提取的信息给name,然后我们输出name就能看到相关的信息了,这个非常重要,掌握了这个才能从网页中爬取我们需要的具体信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/109168
推荐阅读
相关标签
  

闽ICP备14008679号