Python 正则表达式:匹配 URL

Python regex: Matching a URL

我对以下表达式中的模式匹配有些困惑。我试图在网上查找但找不到可以理解的解决方案:

imgurUrlPattern = re.compile(r'(http://i.imgur.com/(.*))(\?.*)?')

括号到底是做什么用的?直到第一个星号我才明白,但我无法弄清楚之后发生了什么。

(.*)表示任意字符重复任意次数,(\?.*)?例如匹配 url 的查询字符串("cat" 的 imgur 搜索):

http://imgur.com/search?q=cat

http://imgur.com/search 与正则表达式的 (http://i.imgur.com/(.*)) 匹配(search(.*) 特别匹配)。 ?q=cat 与正则表达式的 (\?.*)? 匹配。在正则表达式中?最后意味着可选,所以它意味着可能有也可能没有查询字符串。 url http://www.imgur.com 中没有查询字符串。括号用于分组。我们想将 (http://i.imgur.com/(.*)) 分组为一件事,因为它与 url 相匹配,并且其中还有另一组与您请求的页面相匹配(这是 (.*))。我们要分组 (\?.*)? 因为它匹配查询字符串。

这里有一张图表可以帮助你

(http://i.imgur.com/(.*))(\?.*)?

第一个捕获组(http://i.imgur.com/(.*))表示字符串应该以http://i.imgur.com/开头,后跟任意数量的字符(.*)(这是一个糟糕的正则表达式,你不应该这样做)。 (.*)也是第二个捕获组。

第三个捕获组(\?.*)表示这部分字符串必须以?开头,然后包含任意数量的任意字符,如上。

最后一个?表示最后一个捕获组是可选的。

编辑: 然后可以将这些组用作:

p = re.compile(r'(http://i.imgur.com/(.*))(\?.*)?')
m = p.match('ab')
m.group(0);
m.group(2);

要改进正则表达式,您必须将引擎限制为您需要的字符,例如:

(http://i.imgur.com/([A-z0-9\-]+))(\?[[^/]+*)?

[A-z0-9\-]+ limit to alphanumeric characters
[^/] exclude /

正则表达式可以表示为图形以理解其中的操作。节点之间的并行连接表示它是可选的,串行连接表示它是强制性的,循环表示在同一节点上重复。

(http://i.imgur.com/(.*))(\?.*)?

Debuggex Demo

所以这开始于一个 imgur URL http://i.imgur.com/(.*) (强制)有任何字符直到遇到 '?'(可选)。在“?”之后的任何字符之后。注意 '?'已经摆脱了它的常规行为。粉色高亮显示 捕获组