([0-9a-zA-Z_\-]+)/?([^.\/]+)[\.php|\.html]
对于这个表达式,为什么字符串'people'匹配而'person'不匹配?
答案 0 :(得分:3)
因为你在方括号中最后得到的内容应该在括号中。 'people'将它与方括号中的'l'匹配,但'person'在方括号中没有字母。
如果你不想强制匹配.php或.html,你应该用问号跟着它。
这是一个可能的修订版正则表达式:([0-9a-zA-Z_-]+)/?([^.\/]+)(.php|.html)?
>>> p='([0-9a-zA-Z_\-]+)/?([^.\/]+)(\.php|\.html)?'
>>> p=re.compile(p)
>>> p.match('person')
<_sre.SRE_Match object at 0x9bac0c0>
>>> p.match('people')
<_sre.SRE_Match object at 0x9bac2f0>
>>> p.match('people').group()
'people'
>>> p.match('person').group()
'person'
使用match.group()函数或您喜欢的语言中的等效函数来查看正则表达式的哪个部分实际匹配。它可能非常有启发性。
<小时/> 对于评论中的修订问题:
>>> p=re.compile('([0-9a-zA-Z_\-]+)(|\.html|\.php)$')
>>> p.match('ddd').group()
'ddd'
>>> p.match('ddd.html').group()
'ddd.html'
>>> p.match('ddd.jpeg').group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'