关于正则表达式中过度匹配问题解决方法

被匹配的内容含有多处符合匹配规则的内容,如果我需要把它输出,如何防止过度匹配?

version 1:

unicodePage = '<td><input type="checkbox" value="110026" /></td><td>1</td>'
myItems = re.findall('<td.+</td>',unicodePage,re.S)
for item in myItems:
	print item

输出为:

<td><input type="checkbox" value="110026" /></td><td>1</td>

很明显,此处有2处地方都符合匹配规则,但是只匹配了最长的一个,这是因为因为*+都是贪婪型的元字符,它们在匹配时的行为模式是多多益善,它们会尽可能从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。
那如果我们想匹配尽可能多,我们该怎么做:

当不需要这种贪婪行为时,可以使用这些元字符的懒惰型版本。懒惰意思是匹配尽可能少的字符,与贪婪型相反。懒惰型元字符只需要给贪婪型元字符加上一个?后缀即可。下面是贪婪型元字符的对应懒惰型版本:
* *?
+ +?
{n,} {n,}?

version 2:

unicodePage = '<td><input type="checkbox" value="110026" /></td><td>1</td>'
myItems = re.findall('<td.+?</td>',unicodePage,re.S)
for item in myItems:
	print item

输出为:

<td><input type="checkbox" value="110026" /></td>
<td>1</td>

达到我们的目的。

posted on 2016-04-23 20:24  XD大侠  阅读(770)  评论(0编辑  收藏  举报

导航