先引入一下百度百科对于正则表达式的概念:

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

然后我们来引入一下贪婪算法与非贪婪算法的一个概念:

贪婪算法:

贪婪匹配(默认的):在整个表达式匹配成功的前提下,尽可能多的匹配
表达方式: .* .+ .? ·······

非贪婪算法:

贪婪匹配:在整个表达式匹配成功的前提下,尽可能少的匹配 
表达方式: .* ? .+? .?? ·······

当然我们通过代码也可以看出来

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正则表达式贪婪算法与非贪婪算法与正则表达式子模式的简单应用的更多相关文章

  1. Python之路第六天,基础(7)-正则表达式(re)

    Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...

  2. Python爬虫入门(7):正则表达式

    下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串” ...

  3. Python学习笔记(三十一)正则表达式

    ---恢复内容开始--- 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 ...

  4. python学习笔记(一)——关于正则表达式的学习小结

    python中提供了re这个模块提供对正则表达式的支持. 一.正则表达式常用到的一些语法(并非全部): . 匹配任意单个字符 [...] 匹配单个字符集 \w 匹配单词字符,即[a-zA-Z0-9] ...

  5. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    前言 hello,大家好 本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json 所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去 ...

  6. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  7. python爬虫之小说网站--下载小说(正则表达式)

    python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...

  8. Nginx的Rewrite正则表达式,匹配非某单词

    Nginx的Rewrite正则表达式,匹配非某单词 由于要rewrite一个地址从 /mag/xx/xxx/ -> /m/xxx 但原先 /mag/xx/more/ 要保留 这就得写一个比较奇特 ...

  9. python爬虫知识点总结(五)正则表达式

    在线正则表达式匹配:http://tool.oschina.net/regex 正则表达式学习:https://c.runoob.com/front-end/854 一.什么是正则表达式? 常见匹配模 ...

随机推荐

  1. import同目录的py文件 :ModuleNotFoundError: No module named 'pdf'

    报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/2.NLP/2.获取数据源和规范化/5.crea ...

  2. CF - 1110 C Meaningless Operations

    题目传送门 题解: 首先根据观察,很容易发的是: x != (1<<k) - 1 时候 答案就是, 将x二进制下再最高位后的0都变成1. 然后就是考虑 x == (1<<k) ...

  3. 反序列化JSON

    本人编程生涯刚刚起步,以下是个人理解,如果有些不对的地方,请各位在评论区指出,如果有更详细的博客也可以推荐给我. 首先要根据JSON创建一个实体类,并且要实现Serializable接口,再创建一个J ...

  4. d3.js 实现烟花鲜果

    今天在d3.js官网上看到了一个烟花的DEMO,是canvas制作的,于是我想用d3.js来实现它,js代码只有几行.好了废话不多说,先上图. 1 js 类 因为烟花要有下落的效果,所以里面用到了一些 ...

  5. 对TD tree系统评价及改进

    该系统是由石家庄铁道大学2017级信息学院的同学研发并改进,分享给我们18级新生的一份体验,这项app可安装在任意一个智能手机上,当听到学长们像我们介绍这款app的时候,着实让我惊呆了,惊叹学长们的编 ...

  6. App 冷启动与热启动及启动白屏优化

    介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果.那么,先来看看什么叫冷启动和热启动. 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动. 热启动:指 a ...

  7. python安装第三方包的安装路径, dist-packages和site-packages区别

    简单来说 如果是系统自带的python,会使用dist-packages目录 如果你手动安装python,它会直接使用目录site-packages 这允许你让两个安装隔离开来 dist-packag ...

  8. Flink 从 0 到 1 学习 —— 如何自定义 Data Sink ?

    前言 前篇文章 <从0到1学习Flink>-- Data Sink 介绍 介绍了 Flink Data Sink,也介绍了 Flink 自带的 Sink,那么如何自定义自己的 Sink 呢 ...

  9. Elasticsearch(10) --- 内置分词器、中文分词器

    Elasticsearch(10) --- 内置分词器.中文分词器 这篇博客主要讲:分词器概念.ES内置分词器.ES中文分词器. 一.分词器概念 1.Analysis 和 Analyzer Analy ...

  10. LeetCode 430. Faltten a Multilevel Doubly Linked List

    题目链接:LeetCode 430. Faltten a Multilevel Doubly Linked List class Node { public: int val = NULL; Node ...