加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则

发布时间:2020-12-13 21:55:31 所属栏目:百科 来源:网络整理
导读:#--Name: 正则 0x00 什么是正则表达式? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符, 以及这些特定字符的组合,组成一个 "规则字符串",这个 "规则字符串"用来 表达对字符串的一种过滤逻辑 特别需要注意的是: 正则表达式非Python


#--Name: 正则


0x00 什么是正则表达式?

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,

以及这些特定字符的组合,组成一个 "规则字符串",这个 "规则字符串"用来

表达对字符串的一种过滤逻辑


特别需要注意的是:

正则表达式非Python独有,re模块实现


0x01 在线正则表达式测试

http://tool.oschina.net/regex/


0x02 python中re模块 match 方法

#re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就会返回none

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


0x03 re.match的相关实例

#最常规的匹配

import re


content = 'Hello 123 4567 World_This is a Regex Demo'

print(len(content))

result = re.match('^Hellosdddsd{4}sw{10}.*Demo$',content)

print(result)

print(result.group())

print(result.span())



#泛匹配 如果上面的匹配你觉得太过于冗长,那么可是使用泛匹配 ' .* '

import re

content = 'Hello 123 4567 World_This is a Regex Demo'

result = re.match('^Hello.*Demo$',content)

print(result)

print(result.group())

print(result.span())


#匹配目标

import re

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^Hellos(d+)sWorld.*Demo$',content)

print(result)

print(result.group()) # 打印全部

print(result.group(1)) # 打印第1个括号内的匹配结果,如果表达式中有多个括号,第一个括号内的结果就是group(1)

#第二个括号内的结果就是group(2),以此类推

print(result.span())


#贪婪匹配 使用 ' .* ' 尽可能匹配多的字符

import re

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*(d+).*Demo$',content)

print(result.group(1))


#非贪婪匹配 使用 ' .*? ' 尽可能匹配少的字符

import re

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*?(d+).*Demo$',content)

print(result.group(1))


#匹配模式 .* 除了换行符之外,可以匹配任意字符,需要匹配换行时,则需要指定 ' re.S ' 模式

import re

content = '''Hello 1234567 World_This

is a Regex Demo

'''

result = re.match('^He.*?(d+).*?Demo$',content,re.S)

print(result.group(1))




#转义

#用例1: 在不转意的情况下

import re


content = 'price is $5.00'

result = re.match('price is $5.00',content)

print(result)


#用例2: 加入转义

import re


content = 'price is $5.00'

result = re.match('price is $5.00',content)

print(result)



#总结: 在实际的使用中 尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就用 re.S








0x04 re.search 使用实例

#re.search 扫描整个字符串并返回第一个成功的匹配


#用例1: 使用re.match方法

import re


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.match('Hello.*?(d+).*?Demo',content)

print(result)


#用例2: 使用re.search方法

import re


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.search('Hello.*?(d+).*?Demo',content)

print(result)

print(result.group(1))


#总结: 为了匹配方便,在能用search方法的场景下,就不用match


0x05 匹配演练

#匹配1: 匹配 有active的li标签

import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a>

</li>

</ul>

</div>'''

result = re.search("<li.*?active.*?singer='(.*?)'>(.*?)</a>",html,re.S)

if result:

print(result.group(1),result.group(2))


#匹配: 匹配第二个li标签

import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a>

</li>

</ul>

</div>'''

result = re.search("<li.*?singer='(.*?)'>(.*?)</a>",result.group(2))



#匹配: 匹配有完整歌曲信息的第三个li标签

import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a>

</li>

</ul>

</div>'''

result = re.search("<li.*?singer='(.*?)'>(.*?)</a>",html)

if result:

print(result.group(1),result.group(2))



0x06 re.findall 使用实例

搜索字符串,以列表形式返回全部能匹配的子串

查询符合条件的所有结果


#匹配: 匹配出所有的歌曲链接 歌手名称 歌曲名称

import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'>但愿人长久</a>

</li>

</ul>

</div>'''

results = re.findall("<li.*?href='(.*?)'.*?singer='(.*?)'>(.*?)</a>",re.S)

print(results)

print(type(results))

for result in results:

print(result)


#匹配: 匹配出所有有完整信息的歌曲名称


import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'>但愿人长久</a>

</li>

</ul>

</div>'''

results = re.findall("<li.*?>s*?(<a.*?>)?(w+)(</a>)?s*?</li>",re.S)

print(results)

for result in results:

print(result[1])



0x07 re.sub

替换字符串中每一个匹配的字串后,返回替换后的字符串

#用例1: 把其中的数字替换掉

import re


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.sub('d+','',content)

print(result)


#用例2: 把其中的数字替换成指定内容

import re


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.sub('d+','这里以前是数字',content)

print(result)


#用例3: 被替换中的内容包含原内容的情况

import re


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.sub('(d+)',r'1 8910',content)

#值得注意的是,由于第二个参数中插入了转义字符'',为了保证它的内容是原生内容,前面用了个 'r'

#并且,前面的条件加了个小括号,也就是 group(1)的意思

print(result)


#我们先把<a>标签替换掉,再用findall方法提取数据

#发现数据中存在换行符 n

#我们再用 strip()方法去掉换行符

import re


html = '''<div id='songs-list'>

<h2 class='title'>经典老歌</h2>

<p class='introduction'>

经典老歌列表

</p>

<ul id='list' class='list-group'>

<li data-view='2'>一路上有你</li>

<li data-view='7'>

<a href='/2.mp3' singer='任贤齐'>沧海一声笑</a>

</li>

<li data-view='4' class='active'>

<a href='/3.mp3' singer='齐秦'>往事随风</a>

</li>

<li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li>

<li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li>

<li data-view='5'>

<a href='/6.mp3' singer='邓丽君'>但愿人长久</a>

</li>

</ul>

</div>'''


html = re.sub("<a.*?>|</a>",html)

print(html)

results = re.findall("<li.*?>(.*?)</li>",re.S)

print(results)

for result in results:

print(result.strip())




0x08 re.compile,把字符串编译成正则表达式对象

#将一个正则表达式串编译成正则对象,以便于复用该匹配模式

#用例1:

import re


content = '''Hello 1234567 World_This

is a Regex Demo'''

pattern = re.compile('Hello.*Demo',re.S)

#result = re.match('Hello.*Demo',re.S)

#可以尝试上面的写法和下面的写法用法是一样的

#为什么要这么做? 这是为了便于以后的代码复用

result = re.match(pattern,content)

print(result)



0x09 实战练习

#综合使用之前的方法 做一个豆瓣图书的爬取

import requests

import re

#该实例获取豆瓣图书的出版信息等等

#请写代码实现,获取链接url,书名,作者,出版日期,出版社,简介

#换行符号请使用 re.sub方法来实现

#要使用re.compile

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读