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/(.*))(\?.*)?
所以这开始于一个 imgur URL http://i.imgur.com/(.*) (强制)有任何字符直到遇到 '?'(可选)。在“?”之后的任何字符之后。注意 '?'已经摆脱了它的常规行为。粉色高亮显示 捕获组 。
我对以下表达式中的模式匹配有些困惑。我试图在网上查找但找不到可以理解的解决方案:
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/(.*))(\?.*)?
所以这开始于一个 imgur URL http://i.imgur.com/(.*) (强制)有任何字符直到遇到 '?'(可选)。在“?”之后的任何字符之后。注意 '?'已经摆脱了它的常规行为。粉色高亮显示 捕获组 。