我正在尝试编写一个可以从URL捕获域和路径的正则表达式。我试过了:
https?:\/\/(.+)(\/.*)
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
我做错了什么?
答案 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)