【python 正则表达式:太复杂了所以通过练习-3(URL 统一资源定位器)】编写常见格式的字符串的正则表达式来由浅入深的认识它

5. URL 统一资源定位器

编写一个程序,从字符串中匹配 URL。

URL 的格式为:
  1. 协议名可以是 http、https、ftp。
  2. 域名可以是任意长度。
  3. 端口号可以是任意数字。
  4. 路径可以是任意长度。
  5. 参数可以是任意长度。
  6. 锚点可以是任意长度。

代码如下:

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

直接头皮发麻,不要慌,我们逐个解释

解释

  1. ^$ 是开始和结束的标志;
  2. 第一位必须是 (http|https|ftp) 中的某一个;
  3. 2、3、4位固定为 :\;
  4. 点号之前可以有任意数量的 [a-zA-Z0-9];
  5. 点号之后到最近的那个 ( 之前的部分也是;
  6. ( 开始后的部分,出现一个可选的部分,可选部分以 : 开始,加上任意数量的 [a-zA-Z0-9];
  7. ? 之后到 * 之前,以 / 开头,任意数量的 [a-zA-Z0-9],同时这样的格式可以有0-无限个;
  8. ‘*’ 到下一个 “**” 之前,? 开头,后面加上任意个 [a-zA-Z0-9] ,之后是一个 = 号,后面也是加任意个 [a-zA-Z0-9] ,同时这样的格式可以有0-无限个;
    • 之后,以 # 开头,任意数量的 [a-zA-Z0-9],同时这样的格式可以有0-无限个;

我们学到了什么

  1. 知道了开始和结束的标志是 ^ $;
  2. 知道了原来字符的位置有如此严格的占位限制;
  3. 知道了 () 对表达式进行分组, | 是一个选择标志;
  4. 知道了 a-zA-Z0-9 区间可以这样的连接起来写;
  5. 知道了 + 代表匹配前一位的字符1-无限次,且要写在需要匹配的字符后一位;
  6. 知道了 . 代表字符 . ,\是为了转义;
  7. 知道了 ?在表达式后表示这样的格式可以有或者没有;
  8. 知道了 * 代表匹配前一位的字符0-无限次,且要写在需要匹配的字符后一位;

欢迎留言讨论。

下一部分 待定

你可能感兴趣的:(python,python,正则表达式,开发语言)