Python截断有效的正则表达式模式字符串

时间:2017-11-08 19:13:10

标签: python regex

老实说,试图找到这个问题的解决方案一直让我感到疯狂,因为每个答案都是关于使用正则表达式来截断字符串,或者是具有最大长度的正则表达式模式(在这种情况下,不应该这样做)抛出错误,而不是截断模式字符串?)

反正。我使用的是我雇主提供的正则表达式。目的是只匹配任何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

1 个答案:

答案 0 :(得分:1)

  

有人可以告诉我为什么它会被截断(据我所知),   并提出一个更好的做事方法?

Python有一个正则表达式模式限制。请参阅thisthis。达到最大限制的问题。

  

建议更好的办法吗?

卡西米尔的评论是正确的,urllib.parseurlparse会以更整洁的方式达到预期的效果。

这个答案可能是urlparse的组合,但是你确定什么是扩展,什么不是。这可能有所帮助:Get root domain