Python 正则表达式检查给定字符串是否为相对URL

Python 正则表达式检查给定字符串是否为相对URL,python,regex,Python,Regex,首先,我阅读了有关如何检查字符串是绝对URL还是相对URL的内容。我的问题是,我需要一个正则表达式来检查给定的字符串是否为相对URL,也就是说,我需要一个正则表达式来检查字符串是否以任何协议或双斜杠/开头 事实上,我正在用美丽的汤做网页抓取,我想检索所有相关链接。Beauty Soup使用以下语法: soup.findAll(href=re.compile(REGEX_TO_MATCH_RELATIVE_URL)) 所以,这就是为什么我需要这个 测试用例是 about.html tutoria

首先,我阅读了有关如何检查字符串是绝对URL还是相对URL的内容。我的问题是,我需要一个正则表达式来检查给定的字符串是否为相对URL,也就是说,我需要一个正则表达式来检查字符串是否以任何协议或双斜杠
/
开头

事实上,我正在用美丽的汤做网页抓取,我想检索所有相关链接。Beauty Soup使用以下语法:

soup.findAll(href=re.compile(REGEX_TO_MATCH_RELATIVE_URL))
所以,这就是为什么我需要这个

测试用例是

about.html
tutorial1/
tutorial1/2.html
/
/experts/   
../ 
../experts/ 
../../../   
./  
./about.html
非常感谢。

要匹配绝对值:

/^([a-z0-9]*:|.{0})\/\/.*$/gmi


以及匹配亲属:

/^[^\/]+\/[^\/].*$|^\/[^\/].*$/gmi

要匹配绝对值:

/^([a-z0-9]*:|.{0})\/\/.*$/gmi


以及匹配亲属:

/^[^\/]+\/[^\/].*$|^\/[^\/].*$/gmi

既然你觉得这很有帮助,我就把我的建议贴出来

正则表达式可以是:

^(?!www\.|(?:http|ftp)s?://|[A-Za-z]:\\|//).*

请注意,如果您开始添加排除项或更多替代项,它将变得越来越不可读。因此,也许可以使用详细模式(用
re.X
声明):

另一个是华盛顿·盖德斯的regexes

  • ^([a-z0-9]*:|.{0})\/\/.$
    -匹配

    • ^
      -字符串的开头
    • ([a-z0-9]*:|.{0})
      -2个备选方案:
    • [a-z0-9]*:
      -0个或更多字母或数字,后跟
    • {0}
      -空字符串
    • \/\/.*
      -
      /
      和除换行符以外的0个或更多字符(注意,在Python中不需要转义
      /
    • $
      -字符串结尾
  • 因此,您可以将其重写为
    ^(?[a-z0-9]*:)?//.$
    。他
    i
    标志应与此正则表达式一起使用

  • ^[^\/]+\/[^\/].$|^\/[^\/].*$
    -不是最佳选择,有两个备选方案
  • 备选案文1:

    • ^
      -字符串的开头
    • [^\/]+
      -1个或多个字符,而不是
      /
    • \/
      -文字
      /
    • [^\/].$
      -除
      /
      之外的字符,后跟除换行符以外的任何0个或更多字符
    备选案文2:

    • ^
      -字符串的开头
    • \/
      -文字
      /
    • [^\/].$
      -除
      /
      之外的符号,后跟除换行符以外的任何0个或更多字符,直到字符串末尾

    很明显,整个正则表达式可以缩短为
    ^[^/]*/[^/].$
    i
    选项可以安全地从regex标志中删除。

    既然您觉得它很有用,我就发布我的建议

    正则表达式可以是:

    ^(?!www\.|(?:http|ftp)s?://|[A-Za-z]:\\|//).*
    

    请注意,如果您开始添加排除项或更多替代项,它将变得越来越不可读。因此,也许可以使用详细模式(用
    re.X
    声明):

    另一个是华盛顿·盖德斯的regexes

  • ^([a-z0-9]*:|.{0})\/\/.$
    -匹配

    • ^
      -字符串的开头
    • ([a-z0-9]*:|.{0})
      -2个备选方案:
    • [a-z0-9]*:
      -0个或更多字母或数字,后跟
    • {0}
      -空字符串
    • \/\/.*
      -
      /
      和除换行符以外的0个或更多字符(注意,在Python中不需要转义
      /
    • $
      -字符串结尾
  • 因此,您可以将其重写为
    ^(?[a-z0-9]*:)?//.$
    。他
    i
    标志应与此正则表达式一起使用

  • ^[^\/]+\/[^\/].$|^\/[^\/].*$
    -不是最佳选择,有两个备选方案
  • 备选案文1:

    • ^
      -字符串的开头
    • [^\/]+
      -1个或多个字符,而不是
      /
    • \/
      -文字
      /
    • [^\/].$
      -除
      /
      之外的字符,后跟除换行符以外的任何0个或更多字符
    备选案文2:

    • ^
      -字符串的开头
    • \/
      -文字
      /
    • [^\/].$
      -除
      /
      之外的符号,后跟除换行符以外的任何0个或更多字符,直到字符串末尾

    很明显,整个正则表达式可以缩短为
    ^[^/]*/[^/].$
    i
    选项可以安全地从regex标志中删除。

    我更喜欢这个选项,它捕获了更多的边缘情况:

    (?:url\(|]+(?:src | href)\s*=\s*)(?!['”](?:data | http))['”]([^'\)\s>]+)


    来源:

    我更喜欢这个,它可以捕获更多的边缘案例:

    (?:url\(|]+(?:src | href)\s*=\s*)(?!['”](?:data | http))['”]([^'\)\s>]+)


    来源:

    您知道您所有的测试用例都是相对路径吗?也许为了一些合理的测试也加入一些绝对路径…这个问题与您提供的链接有什么不同?也许可以帮助您。检查某些部分(url属性,例如scheme、netloc)是否为空。我的回答可能会引起争议,但如果是生产代码,我会尽可能避免使用正则表达式,因为10次中有9次,下一个编码者不知道正则表达式,或者需要长时间盯着它看才能确定发生了什么——特别是在有这么多可能性的情况下。从一个全面的协议列表开始,对已识别的协议进行一次功能检查。对unc路径、unix路径、驱动器号进行另一个函数检查,然后列出测试字符串。可读性将比正则表达式更容易,但正则表达式可以随时使用。Palu Macil是对的,看一看a-你确定你想要吗?你知道你所有的测试用例都是相对路径吗?也许为了一些合理的测试也加入一些绝对路径…这个问题与您提供的链接有什么不同?也许可以帮助您。检查某些部分(url属性,例如scheme、netloc)是否为空。我的回答可能会引起争议,但我会尽可能避免使用正则表达式