【问题标题】:python Non greedy regular expression searching too many datapython非贪婪正则表达式搜索太多数据
【发布时间】:2017-05-22 21:05:32
【问题描述】:

字符串:'<td attr="0">str1</td><td attr="5">str2</td><td attr="7">str2</td><td attr="9">str4</td>'

我只想搜索并获得第一个包含文本的“td”标签:“str2”。所以我尝试了两种不同的非贪婪表达式,如下所示:

>>> mystring = '<td attr="0">str1</td><td attr="5">str2</td><td attr="7">str2</td><td attr="9">str4</td>'
>>> print re.search("(<td.*?str2.*?</td>)",mystring).group(1)
<td attr="0">str1</td><td attr="5">str2</td>
>>> print re.search(".*(<td.*?str2.*?</td>).*",mystring).group(1)
<td attr="7">str2</td>

这里我期望输出为"&lt;td attr="5"&gt;str2&lt;/td&gt;",因为我在正则表达式中使用了非贪婪表达式。这里有什么问题以及如何获取预期的搜索结果?

注意:我不能使用 html 解析器,因为我的实际数据集没有那么多格式用于 xml 解析

【问题讨论】:

    标签: regex python-2.7 regex-greedy non-greedy


    【解决方案1】:

    使用[^&gt;] 代替.

    >>> print re.search("(<td[^>]*?>str2.*?</td>)",mystring).group(1)
    <td attr="5">str2</td>
    

    (see demo)

    或者,更好,使用HTMLParser

    编辑:这个正则表达式将匹配子标签:

    (<td[^<]*?(?:<(?!td)[^<]*?)*str2.*?</td>)
    

    【讨论】:

    • 感谢您的回复。我没有使用 html 解析器,因为我的实际数据集不是正确的 xml 格式并且解析器失败。同样在 标签中,有机会拥有多个其他子标签,例如 。但重点是我想获取第一个包含文本的“td”标签:“str2”。
    • 我明白了。我认为this 甚至可以使用子标签。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签