python正则表达式贪婪算法与非贪婪算法与正则表达式子模式的简单应用
先引入一下百度百科对于正则表达式的概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
然后我们来引入一下贪婪算法与非贪婪算法的一个概念:
贪婪算法:
贪婪匹配(默认的):在整个表达式匹配成功的前提下,尽可能多的匹配
表达方式: .* .+ .? ·······
非贪婪算法:
贪婪匹配:在整个表达式匹配成功的前提下,尽可能少的匹配
表达方式: .* ? .+? .?? ·······
当然我们通过代码也可以看出来
import re html = """
<html>
<div><p>九霄龙吟惊天变</p></div>
<div><p>风云际会浅水游</p></div>
</html>
""" #贪婪匹配
pattern = re.compile('<div><p>.*</p></div>',re.S) #表达式为: .*
r_list = pattern.findall(html)
print(r_list) #非贪婪匹配
pattern = re.compile('<div><p>.*?</p></div>',re.S) #表达式为: .*?
r_list = pattern.findall(html)
print(r_list)
我们可以通过输出结果看出来两者的区别
['<div><p>九霄龙吟惊天变</p></div>\n <div><p>风云际会浅水游</p></div>'] #将 \n换行 空格 全部匹配了下来
['<div><p>九霄龙吟惊天变</p></div>', '<div><p>风云际会浅水游</p></div>'] #只是将 两个div中的内容匹配了下来
可以看出 贪婪算法会在字符串中会找到第一个匹配的元素后就会一直寻找到最后一个匹配的元素 即使中间有重复匹配的元素的元素
非贪婪算法会尽可能的少匹配,即为只要满足就会结束,从而寻找下一组匹配的元素
正则算法子模式的应用
如上代码 如果我想要将 九霄龙吟惊天变 风云际会浅水游 这两句诗单独提取出来 就要单独修改代码
pattern = re.compile('<div><p>(.*?)</p></div>',re.S) #表达式为: (.*?)
r_list = pattern.findall(html)
print(r_list)
即为:在需要单独提取出来的元素两边加上() 运行结果为:
['九霄龙吟惊天变', '风云际会浅水游']
下面我们可以进行一些其他的测试 从而更加直观的看到 正则表达式子模式的应用
\w:单次或多次出现的字符 \s:空白字符
s = 'A B C D'
p1 = re.compile('\w+\s+\w+')
print(p1.findall(s))
结果为:
['A B','C D']
s = 'A B C D'
p1 = re.compile('(\w)+\s+\w+')
print(p1.findall(s))
结果为:
['A','C']
s = 'A B C D'
p1 = re.compile('(\w)+\s+(\w+)')
print(p1.findall(s))
结果为:
[('A','B'),('C','D')]
仅供学习! 2019.10.8
python正则表达式贪婪算法与非贪婪算法与正则表达式子模式的简单应用的更多相关文章
- Python之路第六天,基础(7)-正则表达式(re)
Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...
- Python爬虫入门(7):正则表达式
下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串” ...
- Python学习笔记(三十一)正则表达式
---恢复内容开始--- 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 ...
- python学习笔记(一)——关于正则表达式的学习小结
python中提供了re这个模块提供对正则表达式的支持. 一.正则表达式常用到的一些语法(并非全部): . 匹配任意单个字符 [...] 匹配单个字符集 \w 匹配单词字符,即[a-zA-Z0-9] ...
- python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]
前言 hello,大家好 本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json 所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去 ...
- python爬虫—爬取英文名以及正则表达式的介绍
python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- Nginx的Rewrite正则表达式,匹配非某单词
Nginx的Rewrite正则表达式,匹配非某单词 由于要rewrite一个地址从 /mag/xx/xxx/ -> /m/xxx 但原先 /mag/xx/more/ 要保留 这就得写一个比较奇特 ...
- python爬虫知识点总结(五)正则表达式
在线正则表达式匹配:http://tool.oschina.net/regex 正则表达式学习:https://c.runoob.com/front-end/854 一.什么是正则表达式? 常见匹配模 ...
随机推荐
- 手把手教你用深度学习做物体检测(六):YOLOv2介绍
本文接着上一篇<手把手教你用深度学习做物体检测(五):YOLOv1介绍>文章,介绍YOLOv2在v1上的改进.有些性能度量指标术语看不懂没关系,后续会有通俗易懂的关于性能度量指标的介绍文章 ...
- codeforces 828 D. High Load(思维,水题)
题目链接:http://codeforces.com/contest/828/problem/D 题解:任意去一个点为根然后有几个k就是几个子叶也就是根结点有几个分支然后最好的解法就是贪心,将剩下的点 ...
- 牛客小白月赛4 C 病菌感染 dfs
链接:https://www.nowcoder.com/acm/contest/134/C来源:牛客网 题目描述 铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们. 培养皿可 ...
- vim 同时操作多行
使用 vim 的时候,经常会有同时注释或解开注释的情况,逐行编辑很浪费时间,下面的同时操作多行的方式 删除操作 control+v 进入 visual block 模式 选中要删除几行文字 d删除 插 ...
- 一起来读Netty In Action之netty的组件和设计(二)
在上一篇博客中,我们给出了java高性能网络编程的技术基础,也简单的介绍了netty的核心构件,在这一篇博客中,我们将更加详细的研究netty的各个组件,并且密切关注它们是如何通过协作来支撑这些体系结 ...
- Java 创建/识别条形码、二维码
条形码(Barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常用于标示物品的生产国.制造厂家.商品名称.生产日期.图书分类号.邮件起止地点.类别.日期等 ...
- SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战
前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能承受的范围内既能减少资源开销又能防御恶意攻击. 在前面的文章中,我们使用了开源工具包 Guava 提供的限流工 ...
- shell脚本中添加用户并设置密码
有时候在初始化shell脚本中希望能顺便创建用户并指定密码,使用useradd命令可以达到该效果: useradd -m -p encryptedPassword username 参数说明: -m ...
- 最大公共子序列(Runtime faster than 92.73% of Python3)
其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差 ...
- 即时聊天APP(一)
最新写了一个即时聊天的安卓Demo,是基于Bmob后端开发的app,由于Bmob有较大局限性,因此,我并没有按照开发文档来进行开发,只是简单写了一个基本的文字聊天,以后有时间我会自己写一个带服务端的即 ...