Python正则表达式:字符串不包含“jpg”,必须有“-”和小写字母
我在为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
不过确实,由于.
不在允许的字符范围内,所以检查那些不允许的文件扩展名其实并不是很必要。