如何为这些网址编写正则表达式

时间:2012-07-30 15:36:39

标签: python regex django urlconf

我正在尝试构建一个小wiki,但我在为它们编写正则表达式规则时遇到了问题。

我要做的是每个页面都应该有一个自己的编辑页面,当我在编辑页面上按提交时,它应该将我重定向到维基页面。

我想在我的应用程序中使用以下URL:

  • http://example.com/<page_name>

  • http://example.com/_edit/<page_name>

我的URLConf有以下规则:

url(r'(_edit/?P<page_name>(?:[a-zA-Z0-9_-]+/?)*)', views.edit),
url(r'(?P<page_name>(^(?:_edit?)?:[a-zA-Z0-9_-]+/?)*)', views.page),

但他们因某种原因无法工作。

我该如何做到这一点?

似乎一个 - 或两个 - 匹配相同的东西。

2 个答案:

答案 0 :(得分:3)

按照更简洁的方法,我真的将编辑网址定义为:

http://example.com/<pagename>/edit

在我的拙见中,这是更清晰和可猜测的。

然后,请记住Django以您定义它们的顺序循环您的url模式,并在匹配传入请求的第一个上停止。所以他们定义的顺序非常重要。

回答你的问题:

^(?P<page_name>[\w]+)$匹配对任何/ PageName

的请求

请始终记住起始插入符号和最终的美元符号,即我们希望URL在我们的正则表达式之前和之后分别开始和停止,否则任何前导或尾随符号/字符也会使正则表达式匹配(虽然你可能想在这种情况下出现404。)

^_edit/(?P<page_name>[\w]+)$与编辑网址(或^(?P<page_name>[\w]+)/edit$匹配,如果您喜欢用户友好的网址,通常称为REST网址,而RESTfullnes是一个与网址格式无关的概念)。


总结将以下内容放入您的网址:

url(r'^(?P<page_name>[\w]+)$', views.page)
url(r'^_edit/(?P<page_name>[\w]+)$', views.edit)

您可以使用自己定义的集合更改\w,轻松强制网址不具有某些特定字符。

要了解有关Django URL Dispatching read here的更多信息。

注意:Regexp和危险一样强大,特别是在进入网络时。保持简单,并确保真正理解您的定义,否则您的Web应用程序可能会遇到一些安全问题。

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基

答案 1 :(得分:0)

请尝试以下更简单的网址:

url(r'_edit/(?P<page_name>[\w-]+), views.edit)'
url(r'(?P<page_name>[\w-]+), views.page),