将正则表达式组合成可选组

combing regexes into optional groups

我有 4 个当前可用的正则表达式,但我想将它们组合成 1 个正则表达式,因为有很多相似的元素,这可能是更好的做法。这是在 django urls.py

url(r'^news/(?P<slug>[a-z0-9-]+)/[0-9]+/attachment/[0-9]+/$',                
url(r'^news/(?P<slug>[a-z0-9-]+)/[0-9]+/[0-9]+/$',
url(r'^news/(?P<slug>[a-z0-9-]+)/[0-9]+/$',
url(r'^news/(?P<slug>[a-z0-9-]+)/$',

这是我的尝试,但它只匹配前两个。

^news/(?P<slug>[a-z0-9-]+)/([0-9]+/(attachment/[0-9]+|[0-9]+)?)?/$    

编辑: 每个正则表达式的例子

/news/some-slug/1231/attachment/1231
/news/some-slug/123121/1231/
/news/some-slug/1312/
/news/some-slug/

并且不匹配任何其他模式。

编辑:更新了我的尝试,越来越近了,只是不确定为什么?没有让组成为可选的,因为它应该

测试 http://www.pyregex.com/

嵌套选项:

^news/(?P<slug>.+)/([0-9]+/(attachment/([0-9]+/)?)?)?$

demo