老实说,试图找到这个问题的解决方案一直让我感到疯狂,因为每个答案都是关于使用正则表达式来截断字符串,或者是具有最大长度的正则表达式模式(在这种情况下,不应该这样做)抛出错误,而不是截断模式字符串?)
反正。我使用的是我雇主提供的正则表达式。目的是只匹配任何url字符串中的主机名(所以像https://docs.python.org/3/howto/regex.html中的python.org)。我已经看到了使用urllib.parse的建议,但如果有子域,它也不能正确地删除主机名。这是我使用的正则表达式字符串:
\b(([a-zA-Z0-9\-_]+)\.)+
(?!exe|php|dll|doc|docx|txt|rtf|odt|xls|xlsx|ppt|pptx|bin|
pcap|ioc|pdf|mdb|asp|html|xml|jpg|gif|png|lnk|log|vbs|lco|bat|shell|quit|pdb|vbp|
bdoda|bsspx|save|cpl|wav|tmp|close|py|ico|ini|sleep|run|dat|scr|jar|jxr|apt|w32|css|
js|xpi|class|apk|rar|zip|hlp|tmp|cpp|crl|cfg|cer|plg|tmp)([a-zA-Z]{2,5}|support|report|
i2p|technology|xn--p1ai|com#|moscow|technology)
很长。如果我将它放入正则表达式检查器,如https://pythex.org,它很高兴地告诉我它完美无缺。但是,如果我使用Python shell或Python解释器,编译它然后返回编译的模式给我这个:
re.compile('\\b(([a-zA-Z0-9\\-_]+)\\.)+(?!exe|php|dll|doc|docx|txt|rtf|odt|xls|xlsx|
ppt|pptx|bin|pcap|ioc|pdf|mdb|asp|html|xml|jpg|gif|png|lnk|log|vbs|lco|bat|shell|quit|
pdb|vbp|bdoda|bsspx|save|cpl|wav|tmp|clos)
有人可以告诉我为什么它被截断(据我所知),并建议一个更好的做事方法吗?目标是做这样的事情:
https://docs.python.org/3/library/socket.html -> python.org
www.example.info -> example.info
docs.google.com -> google.com
答案 0 :(得分:1)
有人可以告诉我为什么它会被截断(据我所知), 并提出一个更好的做事方法?
Python有一个正则表达式模式限制。请参阅this和this。达到最大限制的问题。
建议更好的办法吗?
卡西米尔的评论是正确的,urllib.parse的urlparse
会以更整洁的方式达到预期的效果。
这个答案可能是urlparse的组合,但是你确定什么是扩展,什么不是。这可能有所帮助:Get root domain。