我有一个正则表达式的情况。
我的文字看起来像:
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