我有一个正则表达式的情况。

我的文字看起来像:

text='abcd<a href="></a></div>abcd<i><a href=">World Bank</a>'


我想捕获所有超链接,下面给出了我编写的正则表达式-

re.findall("<a href=.+?>(.+?)</a>", text, re.DOTALL)


当我运行它时,它给了我一个输出:

['</a></div>abcd<i><a href=">World Bank']


出现上述输出是因为之间没有字符

<a href="></a>


当我在上述表达式之间插入任何字符时,会得到正确的输出。

从上面的文本中,我需要一个输出

['World Bank']


如何修改正则表达式以获取上述输出。

最佳答案

正如其他回答者所提到的,请勿使用正则表达式来解析html文件。

>>> import re
>>> text='abcd<a href="></a></div>abcd<i><a href=">World Bank</a>'
>>> re.findall(r"(?s)<a href=.+?>([^<>]+)</a>", text)
['World Bank']


[^<>]+否定的字符类,可匹配任何字符但不匹配<>一次或多次。因此,这只会捕获World Bank

让我解释一下为什么findall产生不需要的输出。

<a href=.+?>(.+?)</a>


<a href=.+?>与所有打开的锚标记匹配。
(.+?)</a>非贪婪地捕获一个或多个字符,直到到达结束的a标记为止。因此,这将匹配所有字符</a></div>abcd<i><a href=">World Bank,直到下一个</a>。如果使用(.*?),则会得到两个输出,一个空字符串和World Bank

10-07 16:30
查看更多