2010-11-05 55 views
2

我有麻烦找出Django的URL的Python正则表达式。我有一定的标准,但似乎无法拿出神奇的公式。最后,我可以确定哪个页面是CMS页面,并传递给django函数应该加载的别名url。Python的正则表达式:字符串不包含“JPG”,并且必须有“ - ”和小写字母

以下是有效的字符串一些例子将匹配:

  • 关于美国
  • 接触我们
  • 条款和条件
  • 信息/学习,更-PG2
  • info/my-example-url

基准:

  • 必须全部小写
  • 必须包含一个破折号“ - ”
  • 可以包含数字,字母和一个斜杠“/”
  • 必须至少包含4个字符长,30个字符
  • 一个最大
  • 不能包含特殊字符
  • 不能包含单词:
    • 的.jpg
    • .gif注意:
    • png格式
    • 的.css
    • 的.js

例子不应该匹配:

  • 关于-US(有大写)
  • 联系我们(没有破折号)
  • pg(小于4字符RS)
  • IMG/bg.gif(包含符 “.gif ”)
  • 文件/我-Styles.css中(包含“ 的CSS”)
  • 我页@(含有字母,数字等字符,破折号或斜线)

我知道这是不是差得远呢,但这是据我已经得到了:

(?P<alias>([a-z/-]{4,30})) 

我为有大的要求道歉,但我可以别把我的脑袋缠住这个正则表达式的东西。

谢谢!

+1

嘛,有些人要求的东西,如计算的字符数本身是很难在一个正则表达式做。 另外,我的理解是,网址不区分大小写。 (至少,任何时候我去一个网站,我使用大写字母,我到达,他们都是小写字母数字。) 此外,测试_for_“存在”和类似的东西比否定它更容易。你能先给他们一个规则,在它达到这个规则之前过滤掉它们中的urls吗? – 2010-11-05 18:58:49

+0

我有另一个URL结构只包含大写字母,没有斜杠或破折号,所有的CMS页面都是小写的破折号。此外,长度不是优先考虑的事情,如果它不能完成,或者它的表现很糟糕,我可以放弃它。 – adam 2010-11-05 19:02:02

+0

@Tyr:在正则表达式中如何计算字符很难?另外,URL不区分大小写,至少不是域之后的部分,如果你在Apache上(我认为)。 – 2010-11-05 20:38:08

回答

9

我很困惑,为什么有几位评论员发现这在正则表达式中很难做到。这正是正则表达式擅长的。

if re.match(
    r"""^    # match start of the string 
    (?=.*-)   # assert that there is a dash 
    (?!.*\.(?:jpg|gif|png|css|js)) # assert that these words can't be matched 
    [a-z0-9/-]{4,30} # match 4-30 of the allowed characters 
    $     # match the end of the string""", 
    subject, re.VERBOSE): 
    # Successful match at the start of the string 
else: 
    # Match attempt failed 

然而真实的,因为.不在允许的字符中,对于禁止的文件扩展名的检查是不是真的有必要。

+0

+1该死的,正则表达式再次做到了:)我一直忘记lookahead。 (但是当你打算使用'.match'时,你可以放弃'^',并且最外层的parens可能不平衡,因为最后一个parens会被注释掉;为什么在整个正则表达式中使用非分组呢?) 。 – delnan 2010-11-05 20:38:22

+0

或者,通过不使用单个单一的正则表达式,它本可以通过更少的评论更具可读性:-) – 2010-11-05 20:51:33

+0

@delnan:你说的都对。这些parens是从以前的版本中剩余的,现在我已经将它们删除了。这个'^'确实是不必要的,但是因为它并没有伤害并且使得这个意图更清楚,所以我把它留下了。 – 2010-11-05 22:44:03

0

这是我在SO上的第一篇文章。 Pleeaaase,只要需要我的英文,我会问你。

我认为任何下列RE的不谋而合:

'(?=.{4,30}\Z)(?=.*-)[-a-z0-9/]+\Z' 

'(?=.{4,30}\Z)[a-z0-9/]\*-[-a-z0-9/]\*\Z' 

'(?=.{4,30}\Z)(?:[a-z0-9/]+|)-[-a-z0-9/]*\Z' 
相关问题