gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:20:56 27 4
gpt4 key购买 nike

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

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

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

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

测试用例是

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

非常感谢。

最佳答案

既然你觉得它有帮助,我发布我的建议。

正则表达式可以是:

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

参见 demo

请注意,如果您开始添加排除项或更多替代项,它会变得越来越难以阅读。因此,或许可以使用 VERBOSE 模式(用 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

其他 Washington Guedes 的正则表达式

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

    • ^ - 字符串的开头
    • ([a-z0-9]*:|.{0}) - 2 个备选方案:
    • [a-z0-9]*: - 0 个或多个字母或数字后跟 :
    • .{0} - 空字符串
    • \/\/.* - // 和除换行符以外的 0 个或多个字符(注意您不需要转义 /在 Python 中)
    • $ - 字符串结尾

因此,您可以将其重写为 ^(?:[a-z0-9]*:)?//.*$i 标志应该与此正则表达式一起使用。

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

备选方案 1:

  • ^ - 字符串的开始
  • [^\/]+ - /
  • 以外的 1 个或多个字符
  • \/ - 文字 /
  • [^\/].*$ - / 以外的字符后跟除换行符以外的任意 0 个或多个字符

备选方案 2:

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

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

关于python - 正则表达式检查给定字符串是否为相对 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com