Regex检查给定字符串是否是相对URL

2024-05-19 10:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

实际上,我正在用Beautiful Soup进行web抓取,我想检索所有相关链接。Beautiful Soup使用以下语法:

soup.findAll(href=re.compile(REGEX_TO_MATCH_RELATIVE_URL))

所以,这就是我需要这个的原因。

测试用例是

about.html
tutorial1/
tutorial1/2.html
/
/experts/   
../ 
../experts/ 
../../../   
./  
./about.html

非常感谢。


Tags: 字符串weburl协议内容链接htmlthis
2条回答

要匹配绝对值:

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

Live testing here.


为了匹配亲戚:

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

Live testing here.

既然你觉得有帮助,我就把我的建议发出去。

正则表达式可以是:

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

demo

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

import re
p = re.compile(r"""^                    # At the start of the string, ...
                   (?!                  # check if next characters are not...
                      www\.             # URLs starting with www.
                     |
                      (?:http|ftp)s?:// # URLs starting with http, https, ftp, ftps
                     |
                      [A-Za-z]:\\       # Local full paths starting with [drive_letter]:\  
                     |
                      //                # UNC locations starting with //
                   )                    # End of look-ahead check
                   .*                   # Martch up to the end of string""", re.X)
print(p.search("./about.html"));          # => There is a match
print(p.search("//dub-server1/mynode"));  # => No match

IDEONE demo

另一个华盛顿盖德的统治集团

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

    • ^-字符串的开头
    • ([a-z0-9]*:|.{0})-2替代品:
    • [a-z0-9]*:-0或更多字母或数字,后跟:
    • .{0}-空字符串
    • \/\/.*-//和0个或多个字符(注意,在Python中不需要转义/
    • $-字符串结尾

因此,您可以将其重写为^(?:[a-z0-9]*:)?//.*$。这个regex应该使用i标志。

  1. ^[^\/]+\/[^\/].*$|^\/[^\/].*$-不是最优的,有两种选择

备选案文1:

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

备选方案2:

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

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

相关问题 更多 >

    热门问题