Python 正则表达式检查给定字符串是否为相对URL
首先,我阅读了有关如何检查字符串是绝对URL还是相对URL的内容。我的问题是,我需要一个正则表达式来检查给定的字符串是否为相对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
/
开头
事实上,我正在用美丽的汤做网页抓取,我想检索所有相关链接。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})\/\/.$
-匹配
-字符串的开头^
-2个备选方案:([a-z0-9]*:|.{0})
-0个或更多字母或数字,后跟[a-z0-9]*:
:
-空字符串{0}
-\/\/.*
和除换行符以外的0个或更多字符(注意,在Python中不需要转义/
)/
-字符串结尾$
^(?[a-z0-9]*:)?//.$
。他i
标志应与此正则表达式一起使用
^[^\/]+\/[^\/].$|^\/[^\/].*$
-不是最佳选择,有两个备选方案
-字符串的开头^
-1个或多个字符,而不是[^\/]+
/
-文字\/
/
-除[^\/].$
之外的字符,后跟除换行符以外的任何0个或更多字符/
-字符串的开头^
-文字\/
/
-除[^\/].$
之外的符号,后跟除换行符以外的任何0个或更多字符,直到字符串末尾/
很明显,整个正则表达式可以缩短为
^[^/]*/[^/].$
。i
选项可以安全地从regex标志中删除。既然您觉得它很有用,我就发布我的建议
正则表达式可以是:
^(?!www\.|(?:http|ftp)s?://|[A-Za-z]:\\|//).*
看
请注意,如果您开始添加排除项或更多替代项,它将变得越来越不可读。因此,也许可以使用详细模式(用re.X
声明):
看
另一个是华盛顿·盖德斯的regexes
^([a-z0-9]*:|.{0})\/\/.$
-匹配
-字符串的开头^
-2个备选方案:([a-z0-9]*:|.{0})
-0个或更多字母或数字,后跟[a-z0-9]*:
:
-空字符串{0}
-\/\/.*
和除换行符以外的0个或更多字符(注意,在Python中不需要转义/
)/
-字符串结尾$
^(?[a-z0-9]*:)?//.$
。他i
标志应与此正则表达式一起使用
^[^\/]+\/[^\/].$|^\/[^\/].*$
-不是最佳选择,有两个备选方案
-字符串的开头^
-1个或多个字符,而不是[^\/]+
/
-文字\/
/
-除[^\/].$
之外的字符,后跟除换行符以外的任何0个或更多字符/
-字符串的开头^
-文字\/
/
-除[^\/].$
之外的符号,后跟除换行符以外的任何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)是否为空。我的回答可能会引起争议,但我会尽可能避免使用正则表达式