Python正则表达式:匹配URL

3

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

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

这个括号到底是做什么的?我理解了第一个星号之前的内容,但是我无法弄清楚之后发生了什么。


你是在尝试根据OP中的正则表达式找出实际的URL吗?如果是,那么这并不是真正可能的。 - Joe T. Boka
3个回答

2

正则表达式可以表示为图形以理解它们的操作。节点之间的并联连接表示可选,串联连接表示必须,而循环表示重复使用同一节点。

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

正则表达式可视化

Debuggex演示

这个正则表达式从一个imgur的URL http://i.imgur.com/(.*)(必须)开始,直到遇到“?”为止(可选)。然后再匹配“?”后面的任意字符。请注意,“?”已经被转义以避免它的正常行为。粉色的高亮显示了捕获组


1
"(.*)" 表示任意数量的字符重复,"(\?.*)?" 匹配 URL 的查询字符串,例如 (a imgur search of "cat")。
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匹配,并且其中还有另一个组匹配您请求的页面(这是"(.*)")。我们想将"(\?.*)?"分组,因为它匹配查询字符串。
以下是帮助您理解的图示: enter image description here

1
(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\-]+ 限制为字母数字字符
[^/] 排除 /


所以基本上,每个括号都是一个组? 另外,您建议如何改进不良的正则表达式,为什么它不好? - Vatsal Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接