首先,我已经阅读了这个问题有关如何检查是否字符串是一个绝对或相对URL.我的问题是我需要一个正则表达式来检查给定的字符串是否是相对 URL,即我需要一个正则表达式来检查字符串是否不以任何协议或双斜杠开头//.
实际上,我正在使用Beautiful Soup进行网络抓取,我想要检索所有相关链接.Beautiful Soup使用以下语法:
soup.findAll(href=re.compile(REGEX_TO_MATCH_RELATIVE_URL))
Run Code Online (Sandbox Code Playgroud)
所以,这就是我需要这个的原因.
测试用例是
about.html
tutorial1/
tutorial1/2.html
/
/experts/
../
../experts/
../../../
./
./about.html
Run Code Online (Sandbox Code Playgroud)
非常感谢.
既然你觉得它很有用,我就是在发表我的建议.
正则表达式可以是:
^(?!www\.|(?:http|ftp)s?://|[A-Za-z]:\\|//).*
Run Code Online (Sandbox Code Playgroud)
见演示
请注意,如果您开始添加排除项或更多替代项,它将变得越来越难以理解.因此,也许,使用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
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
其他华盛顿盖德斯的正则表达式
^([a-z0-9]*:|.{0})\/\/.*$ - 火柴
^ - 字符串的开头([a-z0-9]*:|.{0}) - 2种替代方案:[a-z0-9]*: - 后跟0个或多个字母或数字 :.{0} - 一个空字符串\/\/.*- //除了换行符之外的0个或更多字符(注意你不需要/在Python中转义)$ - 字符串结尾所以,你可以把它重写为^(?:[a-z0-9]*:)?//.*$.他的i标志应该与这个正则表达式一起使用.
^[^\/]+\/[^\/].*$|^\/[^\/].*$ - 不是最优的,有2种选择备选方案1:
^ - 字符串的开头[^\/]+ - 除1以外的1个或更多字符 /\/ - 文字 /[^\/].*$- /除换行符之外的任何0个或多个字符以外的字符备选方案2:
^ - 字符串的开头\/ - 文字 /[^\/].*$- /除了换行符之外的任何0个或多个字符以外的符号,直到字符串的结尾.很明显,整个正则表达式可以缩短为^[^/]*/[^/].*$.i可以安全地从正则表达式标志中删除该选项.