条件性的Python正则表达式匹配包含第二个冒号的URL

2024-04-26 13:14:30 发布

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

我正在尝试匹配不包含第二个冒号(在协议中的冒号之后,例如http(s)://)的url或相对路径。你知道吗

我想拒绝表单的URL

https://en.wikipedia.org/wiki/Special:BookSources/0-8018-1841-9

或形式的路径

/wiki/Special:BookSources/0-8018-1841-9

只有一个例外。我想保留第二个冒号的,如果后跟下划线:

https://en.wikipedia.org/wiki/The_Post_Card:_From_Socrates_to_Freud_and_Beyond

或者

/wiki/The_Post_Card:_From_Socrates_to_Freud_and_Beyond`

我现在拥有的正则表达式(基于 this questionthis one)是^[^:]*[:]*.*(/wiki/)[^:]+$,它解决了我需求的第一部分,但没有解决第二部分。你知道吗

我如何解释冒号后跟下划线的特殊情况?你知道吗


Tags: thetofromhttpsorgwikifreudwikipedia
2条回答

负面展望在这里可能最有意义:

^https?://(?!.*:[^_]).*wiki.*

请注意,/wiki/Special:BookSources/0-8018-1841-9严格来说不是URL,因为没有协议。相反,这是一条道路。你可能需要稍微修改一下我上面写的内容,但是消极的展望是解决你问题的简单方法。你知道吗

在处理各种形式、不同方案或没有域锚的url路径时,我喜欢使用urlpath。你知道吗

安装:

pip install urlpath

您可以使用urlpath库检查域后面url的每个部分,以查看它们是否包含不带下划线的冒号。如果您想避免使用regex,这个例子很有用。你知道吗

示例:

>>> from urlpath import URL
>>> url = URL('https://en.wikipedia.org/wiki/Special:BookSources/0-8018-1841-9')
>>> any(':' in i and not ':_' in i for i in url.parts[1:])
True
>>> url2 = URL('https://en.wikipedia.org/wiki/The_Post_Card:_From_Socrates_to_Freud_and_Beyond')
>>> any(':' in i and not ':_' in i for i in url2.parts[1:])
False

在本例中,对于要忽略的url,any语句返回true。如果您想让这个示例更具功能性,还可以使用regex进行过滤。你知道吗

>>> any(re.search(':[^_]',i) for i in url.parts[1:])
True
>>> any(re.search(':[^_]',i) for i in url2.parts[1:])
False

如果您对这些url进行任何请求,我建议您尝试一下urlpath库。它结合了pathlib的灵活性和urllib.parse文件,并已生成它。你知道吗

>>> url.get()
<Response [200]>

相关问题 更多 >