嗯,像往常一样,使用正则表达式匹配 URL 是错误工作的错误工具。您可以使用urlparse(或python3 中的urllib.parse)以非常Python 的方式完成这项工作:
>>> from urlparse import urlparse
>>> urlparse('http://www.example.es/cat1/cat2/some-example_DH148439#.Rh1-js_4')
ParseResult(scheme='http', netloc='www.example.es', path='/cat1/cat2/some-example_DH148439', params='', query='', fragment='.Rh1-js_4')
>>> urlparse('http://www.example.es/cat1/cat2/cat3')
ParseResult(scheme='http', netloc='www.example.es', path='/cat1/cat2/cat3', params='', query='', fragment='')
如果你真的想要一个正则表达式,下面的正则表达式就是一个可以回答你问题的例子:
import re
>>> re.match(r'^[^:]+://([^.]+\.)+[^/]+/([^/]+/)+[^#]+(#.+)?$', 'http://www.example.es/cat1/cat2/some-example_DH148439#.Rh1-js_4') != None
True
>>> re.match(r'^[^:]+://([^.]+\.)+[^/]+/([^/]+/)+[^#]+(#.+)?$', 'http://www.example.es/cat1/cat2/cat3') != None
True
但我提供的正则表达式足以回答您的问题,但不是验证 URL 或将其拆分为多个部分的好方法。我想说它唯一的兴趣是实际回答你的问题。
这是正则表达式生成的自动机,以便更好地理解它:
请注意您的问题,因为 JL 的正则表达式不匹配:
http://www.example.es/cat1/cat2/cat3
在重读您的问题 3 次后,您实际上是在要求以下正则表达式:
\/([^/]*)$
这将匹配您的两个示例:
http://www.example.es/cat1/cat2/some-example_DH148439#.Rh1-js_4
http://www.example.es/cat1/cat2/cat3
@jl-peyret 建议的只是如何匹配/ 之后的一个小点,这会生成以下自动机:
所以,无论你真正想要什么:
- 尽可能使用 urlparse 来匹配 URL 的各个部分
- 如果您尝试定义 django 路由,那么尝试匹配片段是没有希望的
- 下次您提出问题时,请务必准确,并举例说明您的尝试:帮助我们帮助您。