python网络爬虫精解之正则表达式的使用说明
作者:小狐狸梦想去童话镇 发布时间:2023-02-26 17:13:21
一、常见的匹配规则
二、常见的匹配方法
1、match()
match()方法从字符串的起始位置开始匹配,该方法有两个参数,第一个是正则表达式,第二个是需要匹配的字符串;
re.match(正则表达式,字符串)
如果该方法匹配成功,返回的是SRE_Match对象,如果未匹配到,则返回None。
返回成功后有两个方法,group()方法用来查看匹配到的字符串,span()方法用来输出匹配的范围。
import re
content = 'Hello_World,123 456'
result = re.match('^Hello\w{6}\W\d\d\d\s\d{3}',content)
print(result)
print(result.group())
print(result.span())
【运行结果】
<re.Match object; span=(0, 19), match='Hello_World,123 456'>
Hello_World,123 456
(0, 19)
子字符串匹配
在上述我们匹配到了完整的字符串,但是实际需求中可能只需要其中的一部分,这时我们仅需要在要获取的子字符串匹配时加上括号即可。
import re
content = 'Hello_World,123 456'
result = re.match('^Hello\w{6}\W(\d+)\s(\d{3})',content)
print(result)
print(result.group())
print(result.span())
print(result.group(1))
print(result.group(2))
【运行结果】
<re.Match object; span=(0, 19), match='Hello_World,123 456'>
Hello_World,123 456
(0, 19)
123
456
这样通过加括号的形式,将字符串中的数字匹配出来。
通用匹配符
.* 其中.用来匹配任意字符(除换行符),*代表前面出现的字符无限次。因此之前的匹配形式可以写为:
import re
content = 'Hello_World,123 456'
result = re.match('^Hello\.*456$',content)
print(result.group())
【运行结果】
Hello_World,123 456
贪婪匹配和非贪婪匹配
.*匹配是贪婪匹配
.*?是非贪婪匹配
二者的主要区别是,贪婪匹配尽可能多的去匹配字符,而非贪婪匹配是尽可能少的匹配字符。下列代码能够更直观的了解二者之间的区别
import re
content = 'number 12345678 test'
result_1 = re.match('^number.*(\d+).*test$',content)
print('贪婪匹配得到的数字:' + result_1.group(1))
result_2 = re.match('^number.*?(\d+).*test$',content)
print('非贪婪匹配得到的数字:' + result_2.group(1))
【运行结果】
贪婪匹配得到的数字:8
非贪婪匹配得到的数字:12345678
大家会有这样一个疑问为什么贪婪匹配得到的数字少,而非贪婪匹配得到的多,这与前面讲的不太符合啊。
注意,在匹配的时候,贪婪匹配是尽可能多的去匹配字符,因此.*就匹配的是' 1234567‘,只留下8给\d+匹配,非贪婪匹配是尽可能少的匹配字符,故.*?匹配的是' ',留下12345678给\d+匹配,就会得到上述结果。
修饰符
修饰符 | 作用 |
---|---|
re.I | 忽略大小写进行匹配 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包含换行符在内的所有字符 |
re.U | 根据Unicode字符集解析字符 |
re.X | 更加灵活的编写正则表达式 |
转义匹配
匹配特殊字符时,在其前面加反斜线(\)完成转义匹配。
2、search()
在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。如果将整个字符串搜索完了之后还是没有匹配到,则返回None。
3、findall()
与search()不同的是,findall()方法是将返回所有符合正则表达式匹配的内容。返回结果是一个列表,列表中的每个元素都是元组类型。
4、sub()
修改文本内容,原理是对要修改的内容进行替换。
import re
temp = "abcdef123ghi456"
temp = re.sub("\d+","",temp)
print(temp)
【运行结果】
abcdefghi
sub()中的参数分析,第一个参数是正则表达式匹配要更改的内容,第二个参数是使用该参数内容进行替换,第三个参数是要更改的字符串。
5、compile()
将正则字符串编译成正则表达式对象,以便在后面的匹配中进行复用。
来源:https://blog.csdn.net/gets_s/article/details/120090795
猜你喜欢
- Spring Security 介绍到现在,我们还没连上数据库呢。真正的项目中,大部分情况下,我们都是自己设计权限数据库,例如微人事(htt
- 我的目标是写一个非常详细的关于diff的干货,所以本文有点长。也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边
- Python实现对网易云音乐的数据进行一个数据清洗和可视化分析对音乐数据进行数据清洗与可视化分析关于数据的清洗,实际上在上一一篇文章关于抓取
- 一、前言本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开222000
- 前言虽然现在文件上传下载工具多如牛毛,比如http、ftp、sftp、scp等方案都可以用于文件传输,但都是需要安装服务器甚至客户端。有一种
- 当数据文件过大时,由于计算机内存有限,需要对大文件进行分块读取:import pandas as pdf = open('E:/学习
- win10系统本地安装MySQL8.0.20,亲测可用,也是参考了其他大神的操作1. 下载Mysql ,官网下载地址:MySQL官网:链接直
- 最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来。(注意使用的是python
- 前言有时候我们的小程序太大,首次打开小程序的时候回比较慢,这个时候我们可以试试分包操作。分包可以让用户在操作小程序的时候按需下载资源(用户在
- 在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、迭代器和生成器理解进行
- 需求:需要在v-html的html字符串的button中绑定点击事件,需要点击后做一些操作,必须渲染成html,但是渲染后的html里面写绑
- 准备工作开发环境:python2.6,reportlab准备中文字体文件:simsun.ttc代码:#!/usr/bin/env pytho
- 一、场景浏览器访问淘宝,再访问天猫,继续访问1688......此时,浏览器中的cookie是什么状态?显然,包含上述3个网站的所有cook
- 所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事。异常的处理是跨越编程语言的,和具体的编程细节相比
- FileUpload上传图片(图片不变形) 的实现方法,需要的朋友可以参考下。<style type="text/css&q
- 前言今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练习吧,提高自己的
- python-try-except:pass用法1.为了跳过for循环里的某次循环以下代码当某次循环发生错误时,执行except代码块,co
- 本文实例讲述了JS简单模拟触发按钮点击功能的方法。分享给大家供大家参考,具体如下:<html> <head&g
- 在大家的日常python程序的编写过程中,都会有自己解决某个问题的解决办法,或者是在程序的调试过程中,用来帮助调试的程序公式。小编通过上万行
- 代码如下webfig1.pyfrom flask import Flaskfrom flask import render_template