Python网络爬虫——正则表达式


正则表达式测试工具:https://tool.oschina.net/regex

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

从字符串的起始位置匹配正则表达式,匹配成功返回成功结果,失败返回None。

import re
result = re.match('正则表达式', 匹配字符串)
# 结果是SRE_Match对象,证明匹配成功
print(result)
# .group()方法:匹配到的内容
print(result.group())
# .span()方法:匹配结果在原字符串的位置范围
print(result.span())
1、匹配目标
import re
content = 'Hello 12345 world'
# 使用括号将想要提取的子串括起来,使用.group()方法,传入1-N依次获取子串的值
result = re.match('^Hello\s(\d+)\s\w+', content)

print(result.group(1))
# 结果:12345
2、通用匹配
import re
content = 'Hello 12345 world'
# 使用.*(点表示任意字符,星表示0-N个)来无限次的匹配任意字符
result = re.match('^Hello.*world$', content)

print(result.group())
# 结果:Hello 12345 world
3、贪婪匹配(.*)和非贪婪匹配(.*?)
# ——贪婪匹配——
import re
content = 'Hello 12345 world'
# 贪婪匹配下.*会皆可能多的匹配字符,所以将 worl匹配到了.*结果中
result = re.match('^Hello.*(\w+)', content)
print(result.group(1))
# 结果:d


# ——非贪婪匹配——
import re
content = 'Hello 12345 world'
# 非贪婪匹配就是尽可能少的匹配字符,所以在符合整个正则式前提下只给.*匹配了一个空格符
result = re.match('^Hello.*?(s\w+)', content)
print(result.group(1))
# 结果:12345: 日常使用中字符串中间尽量使用非贪婪匹配以免出现匹配缺失
    字符串结尾使用非贪婪匹配可能匹配不到任何内容
4、修饰符

正则表达式可以包含一些可选修饰符来控制匹配的模式。

.*不能匹配换行符,所以re.match('正则式', 字符串, re.S)可以通过加入re.S修饰符来让.*可以匹配换行符。

绝大部分HTMl文本都包含换行符,所以尽量都需要加上re.S修饰符,以免出现匹配不到的问题。

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

当遇到用于正则匹配模式的特殊字符时,在前面加反斜杠 \ 转义即可。

三、匹配方法——search()

匹配时扫描整个字符串,返回第一个成功匹配的结果,如果搜索完还没找到匹配的字符串则返回None。

因此为了匹配方便,尽量使用search()方法。

import re
result = re.search('正则表达式', 匹配字符串)
# 结果是SRE_Match对象,证明匹配成功
print(result)
# .group()方法:匹配到的内容
print(result.group())
# .span()方法:匹配结果在原字符串的位置范围
print(result.span())
四、匹配方法——findall()

该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。

有返回结果的话就是列表类型,所以需要遍历一遍依次获取每组内容。

提取多个内容时,可以用findall()方法;提取一个内容时,可以使用search()方法。

import re
result = re.findall('正则表达式', 匹配字符串)
# 结果是列表类型,列表内的每个元素都是元组类型
for i in result:
   	print(i)
    print(i[0], ..., i[n])
五、匹配方法——sub()

可以使用sub()方法修改文本。

可以使用sub()方法替换目标字符串中的无用选项为空,然后进行提取操作。

import re
re.sub('正则表达式', '替换成的字符串', 原字符串)
六、匹配方法——compile()

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

compile()方法还可以传入修饰符,如re.S

可以说compile()方法就是给正则表达式做了一层封装,以便更好的代码复用。

import re
pesult = re.compilr('正则表达式')
re.findall(pesule, 匹配字符串)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值