Python正则表达式:字符串不包含“jpg”,必须有“-”和小写字母

2 投票
2 回答
9313 浏览
提问于 2025-04-16 06:37

我在为Django的URL写Python正则表达式时遇到了一些麻烦。我有一些特定的要求,但就是想不出合适的写法。最终目的是为了识别哪些页面是CMS页面,并将应该加载的别名URL传递给Django的函数。

以下是一些有效的字符串示例,这些字符串应该符合要求:

  • about-us
  • contact-us
  • terms-and-conditions
  • info/learn-more-pg2
  • info/my-example-url

要求:

  • 必须全部小写字母
  • 必须包含一个连字符 "-"
  • 可以包含数字、字母和斜杠 "/"
  • 长度必须在4到30个字符之间
  • 不能包含特殊字符
  • 不能包含以下单词:
    • .jpg
    • .gif
    • .png
    • .css
    • .js

以下是一些不符合要求的示例:

  • About-Us(有大写字母)
  • contactus(没有连字符)
  • pg(少于4个字符)
  • img/bg.gif(包含“.gif”)
  • files/my-styles.css(包含“.css”)
  • my-page@(包含了字母、数字、连字符或斜杠以外的字符)

我知道这还远远不够,但这是我目前的进展:

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

抱歉我的要求有点多,但我就是搞不懂这个正则表达式的东西。

谢谢!

2 个回答

0

这是我在Stack Overflow上的第一篇帖子。
请在我需要的时候纠正我的英语,我真的很希望你们能帮忙。

我觉得下面的任何一个正则表达式都适合:

'(?=.{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'
10

我有点困惑,为什么有些评论者觉得用正则表达式做这件事很难。其实,正则表达式就是用来处理这种事情的。

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

不过确实,由于.不在允许的字符范围内,所以检查那些不允许的文件扩展名其实并不是很必要。

撰写回答