Spider--补充--Re模块_1
# @ Author : Collin_PXY
# 正则表达式:
import re
# 1,分步写法:
# 1)rule.search(string)
pattern='各小区'
rule=re.compile(pattern)
tel=rule.search(string) # 返回第一个匹配的 re.Match object对象
print(tel.group()) 或 print(tel.group(0)) # 返回匹配到的字符串
# 2)relue.findall(string)
pattern='各小区'
rule=re.compile(pattern)
rule.findall(str) # 以列表的形式返回结果,如果没找到就返回空列表, 对于使用了()分组的 pattern,则只返回 分组内的匹配结果列表。
# 2,简化写法: # 其中flags可以省略.
target=re.search(pattern, string, flags) # 返回第一个匹配的 re.Match object对象
target.group() # 返回匹配到的字符串 或:
target.group(0)
re.findall(pattern, string, flags) # 以列表的形式返回结果,如果没找到就返回空列表, 对于使用了()分组的 pattern,则只返回 分组内的匹配结果列表。
# 3,使用'()'及 group() 对pattern字符串进行分组:
# r'\d\d\d\d-\d\d\d-\d\d\d' 或 r'\d{4}-\d{3}-\d{3}'
# 使用()后改写为:
# r'(\d\d\d\d)-(\d\d\d)-(\d\d\d)' 或 r'(\d{4})-(\d{3})-(\d{3})'
# 3-1) 对于search()来讲,使用()后,对此对象使用使用group([index])方法可获得分组结果。
# 【注意】:
# target.group() 效果等同于target.group(0) 返回匹配符合的整个目标字符串。
# target.group(1)才是分组内的第一组字符串,target.group(2)为分组内的第二组字符串。
# 示例 1:
import re
string="""大家好,请各小区工作过人员注意外来人口,对外来人口实行体温监测,如有外来人员
不服从工作安排,请立马与我处联系,工作电话0539-233-689."""
pattern=r'(\d{4})-(\d{3})-(\d{3})'
tel=re.search(pattern,string) # re.Match object
print(tel) # <re.Match object; span=(60, 72), match='0539-233-689'>
print(tel.group()) # 0539-233-685
print(tel.group(0)) # 0539-233-685 等同上面 返回真个匹配的字符串
print(tel.group(1)) # 0539 返回分组内的第一组字符串
print(tel.group(2)) # 233 返回分组内的第二组字符串
print(tel.group(3)) # 685 返回分组内的第三组字符串
# 3-2)对于findall()来讲,使用()后,返回值由之前的列表变为了以分组的字符串组成的元组为元素的列表。
# 示例:
import re
string="""大家好,请各小区工作过人员注意外来人口,0111-555-011对外来人口实行体温监测,如有外来人员
不服从工作安排,请立马与我处联系,工作电话0539-233-689."""
pattern=r'(\d{4})-(\d{3})-(\d{3})'
tel=re.findall(pattern,string) # re.Match object
print(tel) # [('0111', '555', '011'), ('0539', '233', '689')]
# 4, groups()
# 对于search()来讲,使用()后,其返回值由之前的匹配到的字符串变为了re.Match object对象。
# 此时,对返回对象使用groups()方法后,可【多重指定】到相应的变量。
# 示例:
import re
string="""大家好,请各小区工作过人员注意外来人口,对外来人口实行体温监测,如有外来人员
不服从工作安排,请立马与我处联系,工作电话0539-233-689."""
pattern=r'(\d{4})-(\d{3})-(\d{3})'
tel=re.search(pattern,string) # re.Match object
print(tel) # <re.Match object; span=(60, 72), match='0539-233-689'>
first_tel,mid_tel,last_tel=tel.groups() # 多重指定
print(first_tel) # 0539
print(mid_tel) # 233
print(last_tel) # 689
# 5,当括号也是我们要匹配的目标时:使用转义符号\
# 如(0539)-233-689
pattern=r'(\(\d{4}\))-(\d{3})-(\d{3})'
# 6, 使用管道 | pipe
# 可以同时搜寻比对多个目标字符串,例如想要搜寻target1和target2两个字符串:
# pattern='target1|target2'
# 当target1和target2相同时,只会当作同一个target去搜寻。
# 示例1:
import re
msg = "1234567sdfghjiededd, 123,34567,dffgg"
pattern = 'sdf|3456'
target = re.search(pattern, msg)
print(target) # <_sre.SRE_Match object; span=(2, 6), match='3456'>
print(target.group()) # 3456
print(target.group(0)) # 3456
target_list = re.findall(pattern, msg)
print(target_list) # ['3456', 'sdf', '3456']
# 示例2:
import re
msg="1234567sdfghjiededd, 123,34567,dffgg"
pattern='\d{3}|sdf'
target_list=re.findall(pattern,msg)
print(target_list) # ['123', '456', 'sdf', '123', '345']
# 示例3:
import re
msg="1234567sdfghjiededd, 123,34567,dffgg"
pattern='sdf|sdf'
target_list=re.findall(pattern,msg)
print(target_list) # ['sdf']
# 7, 使用多个 | 管道搜寻
# 示例 1 search:
import re
msg="我爱中国我爱薇薇我爱我家我爱生活" 实际顺序是:中国 薇薇 生活
pattern = '我爱(薇薇|中国|生活)' # 将()分组也用上 寻找-- 我爱中国 我爱薇薇 我爱我家 我爱生活
target=re.search(pattern,msg)
print(target) # <re.Match object; span=(0, 4), match='我爱中国'>
print(target.group()) # 我爱中国 传回搜寻到的第一次匹配到的整个字符串。
print(target.group(0)) # 我爱中国 效果同上 传回搜寻到的整个字符串。
print(target.group(1)) # 中国 传回分组内的第一组字符串 因为匹配到的是 我爱中国 所以分组内只搜寻到了 中国
print(target.group(2)) # 报错 因为 target里只包含了 ‘我爱中国’,括号内只有 中国
# 示例 2 findall:
import re
msg="我爱中国我爱薇薇我爱我家我爱生活"
pattern='我爱(薇薇|中国|生活)'
target_list=re.findall(pattern,msg)
print(target_list) # ['中国', '薇薇', '生活']
# 注意:使用findall时不可以使用group()方法,因为findall 返回的时列表,且只返回分组内的内容。
# 再如:
string="""大家好,请各小区工作过人员注意外来人口,对外来人口实行体温监测,如有外来人员
不服从工作安排,请立马(0539)-233-689与我处联系,工作电话0539-233-689."""
pattern=r'\d{4}-(\d{3})-(\d{3})'
tel=re.findall(pattern,string)
print(tel) # [('233', '689')]
# 8, 使用 ?号做搜寻
# 语法: (target)? 表示要搜寻的这个target字符串或者正则表达式表示的目标可有可无。
# 示例 1 (使用search())
import re
msg = "这个程序的重点是1介绍表达式的各种使用方法和使用情景,嗯2介绍正则表达式的示例"
pattern = "介绍(正则)?表达式"
target = re.search(pattern, msg)
print(target) # <re.Match object; span=(9, 14), match='介绍表达式'>
print(target.group()) # 介绍表达式
print(target.group(0)) # 介绍表达式
print(target.group(1)) # None 1是指 括号内的 正则
# 示例 2 (使用search())
import re
msg = "这个程序的重点是1介绍正则表达式的各种使用方法和使用情景,嗯2介绍正则表达式的示例"
pattern = "介绍(正则)?表达式"
target_list = re.search(pattern, msg)
print(target_list) # <re.Match object; span=(9, 16), match='介绍正则表达式'>
print(target_list.group()) # 介绍正则表达式
print(target_list.group(0)) # 介绍正则表达式
print(target_list.group(1)) # 正则
# 示例 2 (使用 findall)
import re
msg="这个程序的重点是1介绍表达式的各种使用方法和使用情景,嗯2介绍正则表达式的示例"
pattern="介绍(正则)?表达式"
target_list=re.findall(pattern,msg)
print(target_list) # ['', '正则'] 意义不大
# 示例 3:
import re
# 测试 1
msg = 'Please call my secretary using 02-26669999ssss26669999'
pattern = r'(\d\d-)?(\d{8})' # 增加?号
phoneNum = re.search(pattern, msg)
print("完整号码是: %s" % phoneNum.group()) # 完整号码是: 02-26669999
# 测试 2
msg = 'Please call my secretary using 26669999ssss02-26669999'
pattern = r'(\d\d-)?(\d{8})' # 增加?号
phoneNum = re.search(pattern, msg)
print("完整号码是: %s" % phoneNum.group()) # 完整号码是: 26669999
# 9, 使用 * 号做搜寻
# 语法: (target)* 表示要搜寻的这个target字符串或者正则表达式表示的目标可以连续重复出现 0次-多次。
# 示例1: search()
import re
# 测试1
msg = 'Johnson will attend my party tonight.'
pattern = 'John((na)*son)' # 字符串na可以0到多次
txt = re.search(pattern, msg) # 传回搜寻结果
print(txt.group()) # Johnson
# 测试2
msg = 'Johnnason will attend my party tonight.'
pattern = 'John((na)*son)'
txt = re.search(pattern, msg)
print(txt.group()) # Johnnason
# 测试3
msg = 'Johnnananason will attend my party tonight.'
pattern = 'John((na)*son)'
txt = re.search(pattern, msg)
print(txt.group()) # Johnnananason
# 示例2: findall()
import re
# 测试1
# 对于findall,有多个嵌套括号的,返回的是以元组为元素的列表,元组的元素的数量取决于嵌套括号的数量,元组的元素的顺序是从外到内。看例子:
msg = 'Johnson will attend my party tonight.'
msg = 'Johnson will Johnnanason attend Johnna my party tonight.'
pattern = 'John((na)*son)' # 字符串na可以0到多次 匹配到的字符串必须包含 ’John‘ 及 ‘son’. ‘na’可有可无
txt_list = re.findall(pattern, msg) # 多个括号的,返回的是以元组为元素的列表, [('son', ''), ('nanason', 'na')]
print(txt_list)
for i in txt_list:
for j in i:
if j !="":
print("John"+j) # Johnson
# 测试2
msg = 'Johnnason will attend my party tonight.'
pattern = 'John((na)*son)'
txt_list = re.findall(pattern, msg)
print(txt_list.group()) # Johnnason
# 测试3
msg = 'Johnnananason will attend my party tonight.'
pattern = 'John((na)*son)'
txt_list = re.findall(pattern, msg)
print(txt_list.group()) # Johnnananason
# 10, 使用 + 做搜寻 一般用于search()
# 语法: (target)+ 表示要搜寻的这个target字符串或者正则表达式表示的目标可以连续重复出现 1次 - 多次。
import re
# 测试1
msg = 'Johnson will attend my party tonight.'
pattern = 'John((na)+son)' # 字符串na可以0到多次
txt = re.search(pattern,msg) # 传回搜寻结果
print(txt.group()) # None
# 测试2
msg = 'Johnnason will attend my party tonight.'
pattern = 'John((na)*son)'
txt = re.search(pattern,msg)
print(txt.group()) # Johnnason
# 测试3
msg = 'Johnnananason will attend my party tonight.'
pattern = 'John((na)*son)'
txt = re.search(pattern,msg)
print(txt.group()) # Johnnananason
# 11, 搜寻时忽略大小写
# 给search()或findall()增加一个参数 re.I 或 re.IGNORECASE
import re
msg = 'john and TOM will attend my party tonight. JOHN is my best friend.'
pattern = 'John|Tom' # 搜寻John和Tom
txt = re.findall(pattern, msg, re.I) # 传回搜寻忽略大小写的结果
print(txt) # ['john', 'TOM', 'JOHN']
pattern = 'Mary|tom' # 搜寻Mary和tom
txt = re.findall(pattern, msg, re.I) # 传回搜寻忽略大小写的结果
# 12, 贪婪和非贪婪模式
# pattern = '(son){3,5}?' pattern分为3部分,第一部分是要匹配的字符串,第二部分是重复次数{m,n},*,+,第三部分缺省的时候是贪婪,?时为非贪婪。
# 12-1)(target){n},(target){n,m},(target){n,},(target){,m}
# 1)--(target){n}设定搜寻的目标的重复次数 n次
# (son){3}表示sonsonson, 此时sonson就不能被匹配到。
# 2)--(target){n,m}设定搜寻的目标的重复次数范围 n~m次
# (son){1,3}表示 (son)|(son){2}|(son){3}
# 此时 son sonson sonsonson 就都能被匹配到。
# 1)贪婪模式 示例:
import re
def searchStr(pattern, msg):
txt = re.search(pattern, msg)
if txt == None: # 搜寻失败
print("搜寻失败 ",txt)
else: # 搜寻成功
print("搜寻成功 ",txt.group())
msg1 = 'son'
msg2 = 'sonson'
msg3 = 'sonsonson'
msg4 = 'sonsonsonson' 实际上sonsonsonson包含了 sonsonson
msg5 = 'jsonsonsonsonson' 实际上sonsonsonsonson包含了 sonsonsonson 和 sonsonson
pattern = '(son){3,5}'
# pattern = 'j(son)*'
searchStr(pattern,msg1) # 搜寻失败 None
searchStr(pattern,msg2) # 搜寻失败 None
searchStr(pattern,msg3) # 搜寻成功 sonsonson
searchStr(pattern,msg4) # 搜寻成功 sonsonsonson 贪婪模式下只列出最长的
searchStr(pattern,msg5) # 搜寻成功 sonsonsonsonson 贪婪模式下只列出最长的
searchStr(pattern,msg5) # 搜寻成功 sonsonsonsonson 贪婪模式下只列出最长的
# 3)--(target){n,}设定搜寻的目标的重复次数范围 n次及以上
# 4)--(target){,m}设定搜寻的目标的重复次数范围 m次及以下
# 12-2) 贪婪与非贪婪搜寻:
# pattern = '(son){3,5}' 默认模式:贪婪模式 列出最长的匹配的字符串
# pattern = '(son){3,5}?' 右侧加个?表示 非贪婪模式 列出最短的匹配的字符串
# pattern = 'j(son)*?'
# 非贪婪模式 示例:
import re
def searchStr(pattern, msg):
txt = re.search(pattern, msg)
if txt == None: # 搜寻失败
print("搜寻失败 ",txt)
else: # 搜寻成功
print("搜寻成功 ",txt.group())
msg1 = 'son'
msg2 = 'sonson'
msg3 = 'sonsonson'
msg4 = 'sonsonsonson' # 实际上sonsonsonson包含了 sonsonson
msg5 = 'sonsonsonsonson' # 实际上sonsonsonsonson包含了 sonsonsonson 和 sonsonson
pattern = '(son){3,5}?' # 非贪婪模式
# pattern = 'j(son)*?' # 非贪婪模式
searchStr(pattern,msg1) # 搜寻失败 None
searchStr(pattern,msg2) # 搜寻失败 None
searchStr(pattern,msg3) # 搜寻成功 sonsonson
searchStr(pattern,msg4) # 搜寻成功 sonsonson 非贪婪模式下只列出最短的
searchStr(pattern,msg5) # 搜寻成功 sonsonson 非贪婪模式下只列出最短的
import re
msg="这个程序的重点是介绍表达式的各种使用方法和使用情景,嗯介绍正则表达式的示例"
pattern="介绍(正则)?表达式"
target_list=re.findall(pattern,msg)
print(target_list) # ['', '正则'] 意义不大
参考资料:《Python 王者归来》洪锦魁
Spider--补充--Re模块_1的更多相关文章
- Java 200+ 面试题补充③ Dubbo 模块
昨天在我的 Java 面试粉丝群里,有一个只有一年开发经验的小伙伴只用了三天时间,就找到了一个年薪 20 万的工作,真是替他感到开心. 他的经历告诉我们:除了加强自我实战经验之外,还要努力积累自己的理 ...
- Java 200+ 面试题补充② Netty 模块
让我们每天都能看到自己的进步.老王带你打造最全的 Java 面试清单,认真把一件事做到最好. 本文是前文<Java 最常见的 200+ 面试题>的第二个补充模块,第一模块为:<Jav ...
- Java 200+ 面试题补充 ThreadLocal 模块
让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致. 本文是前文<Java 最常见的 200+ 面试题>的第一个补充模块. 1.ThreadLocal 是什么 ...
- Day5_Py模块_1
1. time & datetime模块 ----------------------------------------------------------- >>> im ...
- day22 模块_1
核能来袭--模块 1.简单了解模块 2.Collections 3.Time模块 4.functools 一.初识模块 其实之前写的每一个PY文件都是一个模块 还有一些我们一直在使用的模块 buil ...
- Py修行路 内置模块补充 datetime模块
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.datetime模块用于是date和time模块的合集,他内部重新封装了time模块,相比于time ...
- re模块补充 configparse模块
import rere.findall("(?:abc)+","abcabcabc")--->['abcabcabc'] import configpar ...
- sys,os,模块-正则表达式
# *__conding:utf-8__* """"我是注释""" sys,os模块 import sysimport os pr ...
- python 常用模块(一): random , time , sys , os模块部分知识.
1.常用模块:(1)collectiaons模块 (2)与时间相关 time模块 (3)random模块 (4)os模块 (5)sys模块 (6) 序列化模块: json , pickle 2 ...
随机推荐
- iOS企业重签名管理软件之风车签名
这是一款在Mac平台下安全可控的iOS签名管理软件,旨在对签名后的APP能够完全控制,包括APP的开启或禁用.设置到期时间锁.注入第三方动态库文件.设置安装限量.修改APP名称和自定义Bundle I ...
- 非阻塞I/O和阻塞I/O
1.简介 等待队列实现在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权.可用于: - 中断处理 - 进程同步 - 定时 2.等待队列头数据结构 1 typedef st ...
- python中的对文件的读写
简单的实例 open函数获取文件,w是写权限,可以对文件进行io操作 file=open('C:/Users/Administrator/Desktop/yes.txt','w') file.writ ...
- docker 升级后或者重装后,启动容器提示:Error response from daemon: Unknown runtime specified docker-runc
之前安装的版本是docker 1.3,并运行了容器jenkins 现在把docker升级版本为docker-ce 19.03 再使用docker ps发现之前的jenkins容器已经退出了 启动容器: ...
- nginx安全:配置网站图片防盗链
一,为什么要做防盗链? 1,什么是盗链? 比如某人有一个A网站, 他不愿自己存储图片,(因为磁盘和带宽都有成本) 就在自己A网站的页面上直接插入B网站的图片, 从而为自己吸引流量,这就是盗链 2,为什 ...
- docker19.03搭建私有容器仓库
一,启动docker后,搜索registry [root@localhost source]# systemctl start docker [root@localhost source]# dock ...
- 每天一个linux命令:ps命令
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进 ...
- 第十二章 LNMP架构之分离数据库
一.课程回顾 1.搭建LNMP环境 1.配置官方源2.yum安装依赖3.yum安装nginx4.配置nginx5.创建用户6.启动并加入开机自启7.上传安装包8.解压安装包9.卸载旧版本PHP10. ...
- STL: set和map的区别、联系、使用
set是一种关联式容器,其特性如下: set以RBTree作为底层容器 所得元素的只有key(键)没有value(值) 不允许出现键重复 所有的元素都会被自动排序 不能通过迭代器来改变set的值,因为 ...
- 微服务nacos服务注册与发现
一,以上一篇为基础 微服务从nacos配置中心获得配置信息 给service1, service2添加依赖 <dependency> <groupId>com.alibaba. ...