python非贪婪的正则表达式搜索太多数据

时间:2017-05-22 21:05:33

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

字符串:'<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>

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

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

1 个答案:

答案 0 :(得分:-1)

使用[^>]代替.

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

see demo

或者,更好,请使用HTMLParser

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

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