正则表达式:我的逻辑有一个缺陷

时间:2014-09-20 04:34:45

标签: python regex

我试图匹配一个模式,其中第一个括号中的非单词字符永远不会重复,并且模式必须以括号中的第二个集合结束。我只是不明白为什么这个测试用例失败了:

regexString = '([\-\._]?[a-zA-Z0-9]+)*'
rgx = re.compile(regexString)
assert(rgx.match('dan--') == None)

4 个答案:

答案 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--'。这确实会失败,断言的结果也是如此。

原因是?,意思是一个(但不是两个或更多)。