Python 仅使用正则表达式匹配内部域链接

Python 仅使用正则表达式匹配内部域链接,python,regex,Python,Regex,我已经研究这个正则表达式很长时间了,运气不好 基本上,我希望解决以下问题: Match: http://ourwebsite.com/index.html <-- match index.html only ourwebsite.com/index.html <-- match index.html only ourwebsite.com/about.html#something <-- match about.html only index.html <-- matc

我已经研究这个正则表达式很长时间了,运气不好

基本上,我希望解决以下问题:

Match:

http://ourwebsite.com/index.html <-- match index.html only
ourwebsite.com/index.html <-- match index.html only
ourwebsite.com/about.html#something <-- match about.html only
index.html <-- match index.html
/about.html <-- match about.html (do not match /, only about.html)
/index <-- match index
/index/ <-- match index/
index/ <-- match index/
/about <-- match about
/about/ <-- match about/
about/ <-- match about/
/about/us/ <-- match about/us/

No match:

someotherwebsite.com/index.html <-- do not match anything
someotherwebsite.com/index <-- do not match anything
这个正则表达式解决了我想做的大部分事情,但是仍然与其他网站匹配

我猜我的正则表达式也不是完全最优的。。有没有更简单的方法


顺便说一下,我正在使用Python来实现这一点。如果有任何库可以做到这一点,我洗耳恭听。

以下是我假设的情况-

URL的格式为yourwebsite.com/blah,所有页面至少包含yourwebsite.com或www.yourwebiste.com文本

因此,我创建了一个包含3个示例的dict,这取决于它是否包含https、www或不包含www-

d = ["https://www.example.com/index.html", "www.example.com/index.html", "example.com/index.html"]
接下来,因为我们总是只搜索匹配项,所以我们使用example.com将其拆分,因为它始终保持不变

为了展示上述dict的所有元素,我们有

import re
for i in d:
    parts = re.split(r'example.com/', i)
    print(parts)
这给了我如下的输出-

['。,'index.html'] ['www.,'index.html'] [,'index.html']

您始终可以使用零件[1]选择第二个方案进行处理。

First Proposal 这个正则表达式将提供您提供的URL中的相对URL,但它不会提供域的区别

^?:http://:www.ourwebsite.com://?[a-z0-9/]+

测试:

说明:

可选http://前缀作为非捕获组 可选www.prefix作为非捕获组 可选的ourwebsite.com域作为非捕获组 可选/域路径分隔符作为非捕获组 捕获包含字符[a-z0-9/]not or?的路径,将在此处结束,您可以使用0-9/]或-etc扩展列表。 第二项建议 ^?:http://:www.?[.a-z0-9-!]+/?[a-z0-9/]+

它还匹配作为捕获组的域,如果存在域,则匹配的组长度为2,如果匹配项[0]与ourwebsite.com不匹配,则可以消除:

测验

注意,如果要在python上不使用regex解析URL:

from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
        params='', query='', fragment='')

摘自:

红色部分是否也包含我们网站的文本?如about/have,文本是否在开头?我试着按原样粘贴它,但一直坚持将其作为代码块,这可能是红色的原因。在这种情况下,红色无关紧要。不管怎样,我们网站下面的那些,比如about/都是内部链接,它们应该匹配得很好。基本上,只要是:A它们是内部链接,如about/or about.html,它们应该匹配;B如果它们是内部链接,如ourwebsite.com/link.html,它们也应该匹配,基本上只需跳过与网站无关的任何链接。比如,你能把它分成两部分吗?一部分包含主站点,另一部分包含其余的东西。如果主站点是匹配的,就可以了,否则就不要处理其余的值。这不是更容易吗?而且,红色表示引号。您可以将其用作\'以不将其标记为引号,并且不会出现红色。假设[1]部分将包含链接是否总是安全的?如果[https://example.com/about-us/more-info.html]是在口述中吗?或者这将如何过滤掉[https://facebook.com/about-us/]?它确实返回了关于我们的信息/more-info.htmlIn在这种情况下,它看起来是一种很好且干净的方法。1+当然。你能想到任何边缘的情况下,这将失败吗?问题是,如果你正在阅读大量的文本,并发现这之间,你必须确保你只与这个URL的工作。否则,它将基于此方法拆分整个文本。否则,我不认为这会失败。太棒了!非常感谢你的帮助!谢谢明天我将详细研究正则表达式的解释。我认为urlparse库是实现这一点的途径。似乎是目前为止最干净的方式。是的,我也这么认为。
from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
        params='', query='', fragment='')