字符串:'<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解析而格式化
答案 0 :(得分:-1)
使用[^>]
代替.
:
>>> print re.search("(<td[^>]*?>str2.*?</td>)",mystring).group(1)
<td attr="5">str2</td>
(see demo)
或者,更好,请使用HTMLParser。
编辑:这个正则表达式甚至匹配子标签:
(<td[^<]*?(?:<(?!td)[^<]*?)*str2.*?</td>)