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

Sea*_* W. 3 python regex

我正在尝试编写一个正则表达式,它将从URL捕获域和路径.我试过了:

https?:\/\/(.+)(\/.*)
Run Code Online (Sandbox Code Playgroud)

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

Match 1
0.  google.com
1.  /foo
Run Code Online (Sandbox Code Playgroud)

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

预期:

Match 1
0.  google.com
1.  /foo/bar
Run Code Online (Sandbox Code Playgroud)

实际:

Match 1
0.  google.com/foo
1.  /bar
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Pal*_*lec 5

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

...

我究竟做错了什么?

+贪心.你应该使用它[^/]而不是点.

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

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

^https?://([^/]+)(/[^?#]*)?
Run Code Online (Sandbox Code Playgroud)

我会相应地避开你的斜线.

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

以下行是用于将URI引用分解为其组件的正则表达式.

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

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

   http://www.ics.uci.edu/pub/ietf/uri/#Related
Run Code Online (Sandbox Code Playgroud)

导致以下子表达式匹配:

   $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
Run Code Online (Sandbox Code Playgroud)

where表示该组件不存在,如上例中的查询组件的情况.因此,我们可以确定四个组件的值和片段为

   scheme    = $2
   authority = $4
   path      = $5
   query     = $7
   fragment  = $9
Run Code Online (Sandbox Code Playgroud)


Gab*_*iMe 5

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