关于正则表达式中过度匹配问题解决方法
被匹配的内容含有多处符合匹配规则的内容,如果我需要把它输出,如何防止过度匹配?
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>
达到我们的目的。
终身学习