使用正则表达式从URL捕获域和路径

时间:2014-01-31 21:15:52

标签: python regex

我正在尝试编写一个可以从URL捕获域和路径的正则表达式。我试过了:

https?:\/\/(.+)(\/.*)

适用于http://example.com/foo

Match 1
0.  google.com
1.  /foo

但不是我对http://example.com/foo/bar所期望的:

预期:

Match 1
0.  google.com
1.  /foo/bar

实际值:

Match 1
0.  google.com/foo
1.  /bar

我做错了什么?

3 个答案:

答案 0 :(得分:5)

  

https?:\/\/(.+)(\/.*)

     

...

     

我做错了什么?

+greedy。您应该在[^/]而不是点上使用它。

另请注意,您的“路径”部分还将包含查询字符串和片段(哈希)。

这个只获得域名(+登录名,密码,端口)和路径(没有查询字符串或片段)。

^https?://([^/]+)(/[^?#]*)?

我将相应的斜线转移给你。

警告:这需要一个有效的URI,因此它很好,并解析权限和路径部分。如果要根据标准解析URI,则需要实现整个语法或从RFC 2396的§8获取官方正则表达式。

  

以下行是用于分解URI的正则表达式   参考其组成部分。

   ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
    12            3  4          5       6  7        8 9
     

上面第二行中的数字只是为了提高可读性;   它们表示每个子表达的参考点(即每个子表达式)   配对括号)。我们引用子表达式匹配的值    作为$。例如,将上述表达式与

匹配
   http://www.ics.uci.edu/pub/ietf/uri/#Related
     

导致以下子表达式匹配:

   $1 = http:
   $2 = http
   $3 = //www.ics.uci.edu
   $4 = www.ics.uci.edu
   $5 = /pub/ietf/uri/
   $6 = <undefined>
   $7 = <undefined>
   $8 = #Related
   $9 = Related
     

其中表示组件不存在,按原样   上例中查询组件的情况。因此,我们   可以确定四个组件和片段的值为

   scheme    = $2
   authority = $4
   path      = $5
   query     = $7
   fragment  = $9

答案 1 :(得分:5)

如上所述 - 这是一个非网格版本:https?:\/\/(.+?)(\/.*)

答案 2 :(得分:0)

像这个'贪婪'版本的东西可能会起作用。我不知道Python是否需要分隔符,所以这只是原始的正则表达式。

 #   https?://([^/]+)(.*)

 https?://
 ( [^/]+ )           # (1)
 ( .* )              # (2)