5. URL 统一资源定位器
编写一个程序,从字符串中匹配 URL。
URL 的格式为:
- 协议名可以是 http、https、ftp。
- 域名可以是任意长度。
- 端口号可以是任意数字。
- 路径可以是任意长度。
- 参数可以是任意长度。
- 锚点可以是任意长度。
代码如下:
import re
def match_url(string):
pattern = r"^(http|https|ftp)://[a-zA-Z0-9]+\.[a-zA-Z0-9]+(:[0-9]+)?(/[a-zA-Z0-9]+)*(\?[a-zA-Z0-9]+=[a-zA-Z0-9]+)*(#[a-zA-Z0-9]+)?$"
match = re.match(pattern, string)
if match:
return True
else:
return False
string = "http://www.example.com/path/to/page.html?param=value#anchor"
print(match_url(string)) # True
string = "https://www.example.com:8080/path/to/page.html?param=value#anchor"
print(match_url(string)) # True
string = "ftp://www.example.com/path/to/file.txt"
print(match_url(string)) # True
直接头皮发麻,不要慌,我们逐个解释
解释
- ^$ 是开始和结束的标志;
- 第一位必须是 (http|https|ftp) 中的某一个;
- 2、3、4位固定为 :\;
- 点号之前可以有任意数量的 [a-zA-Z0-9];
- 点号之后到最近的那个 ( 之前的部分也是;
- ( 开始后的部分,出现一个可选的部分,可选部分以 : 开始,加上任意数量的 [a-zA-Z0-9];
- ? 之后到 * 之前,以 / 开头,任意数量的 [a-zA-Z0-9],同时这样的格式可以有0-无限个;
- ‘*’ 到下一个 “**” 之前,? 开头,后面加上任意个 [a-zA-Z0-9] ,之后是一个 = 号,后面也是加任意个 [a-zA-Z0-9] ,同时这样的格式可以有0-无限个;
-
- 之后,以 # 开头,任意数量的 [a-zA-Z0-9],同时这样的格式可以有0-无限个;
我们学到了什么
- 知道了开始和结束的标志是 ^ $;
- 知道了原来字符的位置有如此严格的占位限制;
- 知道了 () 对表达式进行分组, | 是一个选择标志;
- 知道了 a-zA-Z0-9 区间可以这样的连接起来写;
- 知道了 + 代表匹配前一位的字符1-无限次,且要写在需要匹配的字符后一位;
- 知道了 . 代表字符 . ,\是为了转义;
- 知道了 ?在表达式后表示这样的格式可以有或者没有;
- 知道了 * 代表匹配前一位的字符0-无限次,且要写在需要匹配的字符后一位;