零基础自学python爬虫笔记Day2——正则表达式

定义

Regular Expression, 正则表达式, ⼀种使⽤表达式的⽅式对字符串进⾏匹配的语法规则.
正则的优点:
- 速度快, 效率⾼, 准确性⾼
正则的缺点::
- 新⼿上⼿难度有点⼉⾼.
正则神仙工具:
https://tool.oschina.net/regex/ ——在线正则表达式测试

模  式描  述
\w匹配字母、数字及下划线
\W匹配不是字母、数字及下划线的字符
\s匹配任意空白字符,等价于 [\t\n\r\f]
\S匹配任意非空字符
\d匹配任意数字,等价于 [0~9]
\D匹配任意非数字的字符
\A匹配字符串开头
\Z匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
^匹配一行字符串的开头
$匹配一行字符串的结尾
.匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符
[…]用来表示一组字符,单独列出,比如 [amk] 匹配 a、m 或 k
[^…]不在 [] 中的字符,比如 匹配除了 a、b、c 之外的字符
*匹配 0 个或多个表达式
+匹配 1 个或多个表达式
?匹配 0 个或 1 个前面的正则表达式定义的片段,非贪婪方式
{n}精确匹配 n 个前面的表达式
{n, m}匹配 n 到 m 次由前面正则表达式定义的片段,贪婪方式
a | b匹配 a 或 b
()匹配括号内的表达式,也表示一个组

贪婪匹配

improt re
'''
.* → 表示尽可能多的匹配
'''
str: <div>张三</div><span>李四</span><div>王五</div>
reg: <div>.*</div>   #所匹配字符串正数第一个<div> 倒数第一个</div>
结果:
<div>张三</div><span>李四</span><div>王五</div>

非贪婪匹配(惰性匹配)

improt re
'''
.*? → 表示尽可少的匹配
'''
str: <div>张三</div><span>李四</span><div>王五</div>
reg: <div>.*?</div>   #所匹配字符串正数第一个<div> 正数第一个</div>
结果:
<div>张三</div>
<div>王五</div>

在这里插入图片描述

re正则应用

match
  • 向match传入要匹配的字符串,以及正则表达式,就可以检测这个正则表达式是否匹配字符串。
    match 方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回 None。
    ps:match 方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败了。它更适合用来检测某个字符串是否符合某个正则表达式的规则
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content) #第一个参数传入正则表达式,第二个参数传入要匹配的字符串
print(result)
print(result.group())
print(result.group(1))
print(result.span())


运行结果如下:
<_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'>
Hello 1234567 World
1234567
(0, 19)
  • 修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。
这个修饰符的作用是匹配包括换行符在内的所有字符,不加修饰符会报错

import re
content = '''Hello 1234567 World_This
 is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result.group(1))

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

在网页匹配中,较为常用的修饰符有 re.S 和 re.I

  • 转义匹配
    如果目标字符串中就包含了匹配模式,如:. () 等,则需要转义,否则匹配不成功
import re
content = '(百度) www.baidu.com'
result = re.match('\(百度 \) www\.baidu\.com', content)
print(result)

结果:
<_sre.SRE_Match object; span=(0, 17), match='(百度) www.baidu.com'>
search

与match用法一致,但不需要从开头进行匹配,它会搜索整个匹配字符串,找到符合正则表达式的第一个内容返回。

findall

获取匹配正则表达式的所有内容

sub

可用来修改文本

import re
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)

运行结果如下:
aKyroiRixLg
  • sub+findall
    可先用sub将文本过滤一下,在用findall匹配所有内容
html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
print(result.strip())
compile

可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。

import re
content1 = '2019-12-15 12:00'
content2 = '2019-12-17 12:55'
content3 = '2019-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)

运行结果如下:
2019-12-15 2019-12-17 2019-12-22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值