正则表达式的基本语法和使用详解 Python爬虫最简单的解析库

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » 正则表达式的基本语法和使用详解 Python爬虫最简单的解析库

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑,非Python独有,re模块实现,顺便给大家推荐一个工具–正则表达式查询,以后你会用到的。

常见匹配模式

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’
[^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。
{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配”Bob”中的”o”,但能匹配 “foooood”中的所有 o。”o{1,}” 等价于 “o+”。”o{0,}” 则等价于 “o*”。
{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) 对正则表达式分组并记住匹配的文本
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (…), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#…) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。

re.match

re.match 尝试从字符串的起始位置,如果不是起始位置匹配成功的话,match()就返回none,那么我们通常还会使用match的group方法

import re
content='Hello 18 12345 World_This a 爬虫'
result=re.match('^H\w{4}\s\d{2}\s[0-9]{5}\s\w{10}.*',content)
print(result)
print(result.group())
print(result.span())#打印span属性值

^匹配字符串开头,匹配字母数字及下划线{4}次,\s匹配空格,\d匹配数字2个,然后空格,[0-9]的数字{5}个,.*匹配任意的字符

泛匹配

import re
content='Hello 18 12345 World_This a 爬虫'
result=re.match('^H.*爬虫$',content)
print(result)
print(result.group())

匹配目标

import re
content='Hello 18 12345 World_This a 爬虫'
result=re.match('^H\w{4}\s\d{2}\s(\d+)\sWorld.*爬虫$',content)
print(result)
print(result.group(1))#取出第一个小括号的内容

这么多例子,不知道你们注意到group()没,输出的是(\d+),如果正则表达式中出现了小括号,那么group(1)就是输出第一个小括号里的内容,以此类推,后面用的比较多

贪婪模式(.*)

import re
content='Hello 18 12345 World_This a 爬虫'
print(len(content))
result=re.match('^H.*(\d+).*爬虫$',content)
print(result)
print(result.group(1))

注意(\d+)本来可以吧12345匹配完的,但是就返回了一个5,那么就是.*吧H后面的空格,数字,特别是1234全匹配了,只给(\d+)留了一个5,.*就是贪婪模式,尽可能的匹配多的字符

非贪婪模式(.*?)

import re
content='Hello 18 12345 World_This a 爬虫'
result=re.match('^H.*?(\d+).*爬虫$',content)
print(result)
print(result.group(1))

.*?就是非贪婪模式,从H后面开始匹配,遇到了(\d+)匹配数字的,.*?直接就停止匹配,留给(\d+)来匹配!

匹配模式

import re
content='''Hello 18 12345 World_This
  a 爬虫'''
result=re.match('^H.*?(\d+).*?爬虫$',content,re.S)
print(result)
print(result.group(1))

如果没有re.S结果会报错,因为none没有group(),反正就是会报错,因为.不能匹配换行符,需要加上匹配模式,才可以,然后下面的是一些匹配模式

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

转义

有时候html中含有一些特殊符号,这些符号是有固定的用途的,但是我们需要把它提取出来,这时候就需要对特殊符号进行转义。

import re
content='my salary is $300.99'
result=re.match('my salary is \$300\.99',content)#需要对$进行转义
print(result)

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

re.search

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

import re
content='Welcome to ZJJ Hello 18 12345 World_This a 爬虫'
result=re.match('Hello.*?(\d+).*?爬虫',content)
print(result)

re.match从开始匹配,没有就返回none

import re
content='Welcome to ZJJ Hello 18 12345 World_This a 爬虫'
result=re.search('Hello.*?(\d+).*?爬虫',content)
print(result)

re.search整个开始搜索,匹配成功就返回
总结:为了匹配方便,能用search就不用match

re.findall

搜索字符串,以列表形式返回全部能匹配的字符串(o≖◡≖),我们写一个简单的代码提取所有的图片url和title

import re,requests
html=requests.get('http://pic.netbian.com/').content.decode("gbk")#提取网页的HTML文档
partten=re.compile('<li><a href="(.*?)" title="(.*?)" target="_blank"><span><img src="(.*?)" alt=.*?</a></li>')
result=partten.findall(html)
print(result)

findall()方法不能用group,它返回的是一个List列表,所以可以循环遍历一下( ̄. ̄)

re.sub

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

import re
content='Welcome To my url 123456 hAPPY nEW years '
contents=re.sub('\d+','',content)#将所有的数字替换掉
contents=re.sub('h.*?Y','2020',content) #将hAPPY替换为2020
contents=re.sub('\d+','BeautifulSoup',content)
contents=re.sub('(\d+)',r'\1 8848',content)#不是替换掉数字,而是在数字后面加上8848
print(contents)

我们已经讲过,( )里面的内容可以通过group(1)来提取,同样\1也可以拿到这样的内容,\1 是一个字符,要保证它是一个原生的字符,在前面加一个r

re.split

import re
content='Welcome To my url 123456 hAPPY nEW years '
pattern=re.compile(' ')
result=pattern.split(content) #以空格进行拆分
print(result)

re.compile

将正则字符串编译成正则表达式对象,便于重复用该匹配模式

content='''Welcome ZJJ boke 12345
Heappy New
'''
pattern=re.compile('W.*New',re.S)
result=re.match(pattern,content)#将正则对象传递进来
results=re.match('W.*New',content,re.S)
print(results)
print(result)

两者返回结果是一样的,为什么要这样写呢!原因是为了方面我们遇到需要重复使用的代码,直接调用就可以,不用再写重复的代码

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《正则表达式的基本语法和使用详解 Python爬虫最简单的解析库》 发布于2019-11-11

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

5 + 6 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册