python正则中的贪婪与非贪婪
当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的
>>> s = '<html><head><title>Title</title>'
>>> len(s)
32
>>> print re.match('<.*>', s).span()
(0, 32)
>>> print re.match('<.*>', s).group()
<html><head><title>Title</title>
RE 在 "<html>" 中 匹配 "<",.* 会消耗掉字符串的剩余部分。RE 中保持更多的向左匹配, 不能在字符串结尾匹配“>”,因此正则表达式必须一个字符一个字符地回溯,直到它找到 > 的匹配。最终的匹配从 "<html" 中的 "<" 到 "</title>" 中的 ">",这变成了全文匹配,并不是你想要的结果。
在这种情况下,解决方案是使用不贪婪的限定符 *?、+?、?? 或 {m,n}?,尽可能匹配小的文本。在上面的例子里,在第一个 "<" 之后立即尝试匹配 ">",当它失败时,引擎一次增加一个字符,并在每步重试 匹配">"。这个处理将得到正确的结果:
>>> print re.match('<.*?>', s).group()
<html>
注意一下比较:
>>> re.findall(r"a(\d+?)", "a23b")
['2']
>>> re.findall(r"a(\d+)", "a23b")
['23']
---------------比较一下两者的不同------------------------
>>> re.findall(r"a(\d+)b", "a23b")
['23']
>>> re.findall(r"a(\d+?)b", "a23b")
['23']
有时使用贪婪模式匹配网页代码时,会出现卡机情况,比如用这个语句:
sty_scr_tag = re.compile('(<style.*?[^>]*>.*?([\S\s]+)<\/style>)|(<script.*?[^>]*>.*?<\/script>)|(<script.*?[^>]*>.*?([\S\s]+?)<\/script>)',re.M)
content = sty_scr_tag.sub('', content)
去匹配baike.baidu.com这个网页,你会发现编译器一直卡在那里不会动,但当语句变成这个:
sty_scr_tag = re.compile('(<style.*?[^>]*>.*?<\/style>)|(<script.*?[^>]*>.*?<\/script>)|(<script.*?[^>]*>.*?([\S\s]+?)<\/script>)',re.M)
content = sty_scr_tag.sub('', content)
时,就可以了
python正则中的贪婪与非贪婪的更多相关文章
- python中贪婪与非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符: 非贪婪则相反,总是尝试匹配尽可能少的字符. 在"*","?", ...
- python基础:re模块匹配时贪婪和非贪婪模式
python贪婪和非贪婪 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪则相反,总是尝试匹配尽可能少 ...
- python正则表达式贪婪与非贪婪模式
之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...
- Python正则的贪婪和非贪婪示例
贪婪匹配 import re info = """ saas12 [STREAM] codec_type=audio111 [/STREAM]-- [STREAM] co ...
- js正则中的贪婪和非贪婪模式问题总结
var b="abeeee:eeeee:eeeeeab"; console.log(b.match(/e+\:e+/g));//["eeee:eeeee"]贪婪 ...
- python正则匹配次数,贪婪和非贪婪
贪婪模式 {m,n}表示匹配子串的次数>=m and <=n,再此分为内匹配次数尽可能的多 贪婪模式 {,n}表示 >=0 and <=n 贪婪模式 {m,} 表示> ...
- python 贪婪和非贪婪模式
这样的正则表达式: r'\*(.+)\*' 如果想要匹配*something*这样的一个串按道理说是没问题的 但是如果文本是*this* is *something* 那么我们的正则表达式就会采取贪 ...
- 正则表达式 整理(\w \s \d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $ \b 单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())
re.findall 匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表 一. 匹配单个字符 import re # \w 匹配所有字母.数字.下划线 re.find ...
- python正则中如何匹配汉字以及encode(‘utf-8’)和decode(‘utf-8’)的互转
正则表达式: [\u2E80-\u9FFF]+$ 匹配所有东亚区的语言 [\u4E00-\u9FFF]+$ 匹配简体和繁体 [\u4E00-\u9FA5]+$ 匹配简体 <input ty ...
随机推荐
- 九度oj 题目1465:最简真分数
题目描述: 给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合. 输入: 输入有多组,每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000. ...
- Thinkphp5 PDO操作mysql预处理中文字段出错问题
Thinkphp5手册上建议不用中文表明和中文字段名 今天发现中文字出问题的地方了 $pdo = new PDO('mysql:host=localhost;dbname=xsfm_master', ...
- onclick跳转到其他页面的几种方式
如果是本页显示可以直接用location,方法如下: ①onclick="javascript:window.location.href='URL'" ②onclick=" ...
- BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...
- BZOJ4566 [Haoi2016]找相同字符 【后缀数组】
题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...
- 字符串匹配之Sunday算法
Sunday算法不像KMP算法那么复杂,但是效率又比较高,在KMP之上,下面简单介绍Sunday算法及其实现. Sunday 算法由 Daniel M.Sunday 在 1990 年提出,它的思想跟 ...
- Linux System Programming 学习笔记(四) 高级I/O
1. Scatter/Gather I/O a single system call to read or write data between single data stream and mu ...
- ng-include
ng-include可以作为标签或者属性来使用,作用是引入公用文件. <div ng-include="'header.html'"></div> 注意里面 ...
- Object,String,StringBuffer,StringBuilder,System,Runtime,Date,Math介绍及用法(API)
1 Object对象 面向对象的核心思想:“找合适的对象,做适合的事情”. 合适的对象: 自己描述类,自己创建对象. sun已经描述了好多常用的类,可以使用这些类创建对象. API(App ...
- 【Visual Studio】The project appears to be under source control, but the associated source control plug-in is not installed on this computer
[问题描述]用 Visual Studio 2013打开一个项目时,出现下面错误: [问题原因]参考 http://codeverge.com/asp.net.web-forms/the-projec ...