我试图匹配一个模式,其中第一个括号中的非单词字符永远不会重复,并且模式必须以括号中的第二个集合结束。我只是不明白为什么这个测试用例失败了:
regexString = '([\-\._]?[a-zA-Z0-9]+)*'
rgx = re.compile(regexString)
assert(rgx.match('dan--') == None)
答案 0 :(得分:2)
re.match的文档:https://docs.python.org/2/library/re.html#re.match 如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的MatchObject实例。
在您的情况下'([-._]?[a-zA-Z0-9] +)*'清楚地匹配' dan'丹的一部分 - '因此结果不是None而是MatchObject。如果您不希望它与您群组中的内容匹配,请将您的群组放在^和$之间。
答案 1 :(得分:1)
如果您想检查模式是否与整个字符串匹配,请使用^
,$
锚。
>>> import re
>>> regexString = r'^([\-\._]?[a-zA-Z0-9]+)*$'
>>> rgx = re.compile(regexString)
>>> rgx.match('dan--')
>>> rgx.match('dan')
<_sre.SRE_Match object at 0x00000000029E0D50>
BTW,^
并非严格要求,因为match
仅匹配字符串的开头。
答案 2 :(得分:0)
[\-\._]?
是括号中的以下字符中的一个或全部,后面必须跟一个或多个字母或数字。括号中所有东西的任何东西都不会匹配任何东西。但是,rgx.match('dan--') == None
失败了,因为您可以--
之后dan
,因为您没有指定是否应该在[a-zA-Z0-9]+
之后发生任何事情。你需要锚点。如果您不介意使用下划线,则可以将[a-zA-Z0-9]+
更改为(\w|\d)+
。
'^([\-\.]?[a-zA-Z0-9]+)*$'
# also matches '-underscore_dan'
'^([\-\.]?(\w|\d)+)*$'
答案 3 :(得分:0)
尝试匹配'--dan--'
。这确实会失败,断言的结果也是如此。
原因是?
,意思是零或一个(但不是两个或更多)。