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 一.什么是正则表达式? 常见匹配模 ...
随机推荐
- 模板汇总——ST(暂)
int Log[N]; struct ST { ], a[N]; void init(int n) { ]=-); i < N; i++) Log[i] = Log[i - ] + ((i &a ...
- JavaScript new的运行过程
参考 MDN网站的运算符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new new 运算符 ...
- [DP]最长公共子串
题目 给定两个字符串str1和str2, 长度分别稳M和N,返回两个字符串的最长公共子串 解法一 这是一道经典的动态规划题,可以用M*N的二维dp数组求解.dp[i][j]代表以str1[i]和str ...
- Java并发包下的几个API
并发包 (计数器)CountDownLatch (屏障)CyclicBarrier (计数信号量)Semaphore 案例: 需求: 代码: 并发包 (计数器)CountDownLatch Coun ...
- zookeeper集群部署问题排查记录
今天在三台虚拟机搭建zookeeper集群,一直连不通,然后进行了几个小时的斗争,做个记录. 具体部署方式网上有很多, 不在赘述.产生连接不同的问题主要有以下几个方面: 1.仔细检查配置文件. 是否有 ...
- 解决subline安装插件被墙失败的方法
一.问题场景描述 当你完成subline和package control的安装后,准备使用install package安装各种各样的插件来丰富你的编辑器,却出现类似 “Unable to downl ...
- Redis的最常被问到知识点总结
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- Django与mongodb数据库的连接
1.最开始需要下载一个第三方模块:mongoengine 2.下载完成之后,需要在settings中完成配置(在DATABASES后面,别问我为什么,问了我也不告诉你...) connect中传入的是 ...
- CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案
前几天知道的CCF计算机职业资格认证考试,觉得好像比软考含金量高一些,就去了解了一下,做了模拟试题中的 “出现次数最多的数” 这道题,我的算法和官方答案算法不同,个人觉得觉得官方的好一点,没那么繁琐, ...