zoukankan      html  css  js  c++  java
  • 关于正则表达式中过度匹配问题解决方法

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

    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>
    

    达到我们的目的。

  • 相关阅读:
    [Gamma阶段]展示博客
    [Gamma阶段]测试报告
    软工实践个人总结
    小组最终答辩
    第08组 Beta版本演示
    第08组 Beta冲刺(5/5)
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(2/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(1/5)
  • 原文地址:https://www.cnblogs.com/qcssmd/p/5425464.html
Copyright © 2011-2022 走看看