我试图找到一个正则表达式来提取任何有效的url(不仅仅是http[s])使用正则表达式。不幸的是,每一个输出都很奇怪。我使用这个regex获得的最佳结果:
b((?:[a-z][w-]+:(?:/{1,3}|[a-z0-9%])|wwwd{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}/)(?:[^s()<>]|((?:[^s()<>]|(?:([^s()<>]+)))*))+(?:((?:[^s()<>]|(?:([^s()<>]+)))*)|[^s`!()[]{};:'".,<>?«»“”‘’]))
但我至少可以标记以下问题:
- http://208.206.41.61/email/email_log.cfm?useremail=3Dtana.jones@enron.com&=refdoc=3D(01-128)被提取为http://208.206.41.61/email/email_log.cfm?useremail=3Dtana.jones@enron.com&=
- http://www.onlinefilefolder.com',AJAXTHRESHOLD不需要AJAXTHRESHOLD
- CSS/HTML样式被提取,例如
xmlns:x="urn:schemas-microsoft-com:xslt, ze:12px;color:#666, font-size:12px;color
等
我如何改进这个正则表达式,以确保只提取有效的url ?我不仅从HTML中提取,而且从纯文本中提取。因此,对于我的用例,只使用beautifulsoup
是不可能的。
没有一个正则表达式是完美的,但是这个正则表达式可能会帮助你:
(?:(?:https?|ftp|file)://|www.|ftp.)(?:([-A-Z0-9+&@#/%=~_|$?!:,.]*)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:([-A-Z0-9+&@#/%=~_|$?!:,.]*)|[A-Z0-9+&@#/%=~_|$])
启用标志:不敏感,全局,多行(igm))
来源:http://www.regexguru.com/2008/11/detecting-urls-in-a-block-of-text/