Python {m,n}做';t在m以下匹配,但在n以上匹配。为什么?
当我试图通过regexPython {m,n}做';t在m以下匹配,但在n以上匹配。为什么?,python,regex,python-2.7,Python,Regex,Python 2.7,当我试图通过regex\w{m,n}匹配字符串长度时,它不会像预期的那样匹配长度低于m的字符串,而是匹配长度高于n的字符串 >>> expression = '\w{4,32}' >>> string = 'a'*3 >>> print re.match(expression, string) None >>> string = 'a'*100 >>> output = re.match(expressio
\w{m,n}
匹配字符串长度时,它不会像预期的那样匹配长度低于m
的字符串,而是匹配长度高于n
的字符串
>>> expression = '\w{4,32}'
>>> string = 'a'*3
>>> print re.match(expression, string)
None
>>> string = 'a'*100
>>> output = re.match(expression, string)
>>> len(output.string)
100
为什么会这样?
我应该如何使用它?
match
默认情况下,在字符串的开头匹配,但它也不会锚定到末尾。正则表达式与第二种情况下的前32个a
s匹配。我想你想要:
expression = '^\w{4,32}$'
(之所以
len(output.string)
仍然是100,是因为它只引用正则表达式所匹配的字符串,而不是它实际匹配的部分。您可以使用m.group(0)
查找真正的匹配。)匹配默认情况下,在字符串的开头–但它也不会锚定到末尾。正则表达式与第二种情况下的前32个a
s匹配。我想你想要:
expression = '^\w{4,32}$'
(之所以len(output.string)
仍然是100,是因为它只引用正则表达式所匹配的字符串,而不是它实际匹配的部分。您可以使用m.group(0)
查找真正的匹配项。)您希望输入的字符数在4到32个之间。但是对于长度超过32个字符的纯单词字符串呢?您的正则表达式控制前32个字符,而不关心第33个字符之后的字符。所以第33个字符可以是任何东西
因此:
表示您的字符串可以以任何非单词字符(\W*
)开头,后跟长度介于4和32之间的单词(\W{4,32}
),之后可能包含任何非单词字符(\W*
)<代码>*
表示0或更多重复,它允许您在4到32个字符之间仅输入单词
在您的代码中,由于regex测试通过,它将获得整个字符串的长度。您希望输入的长度介于4到32个字符之间。但是对于长度超过32个字符的纯单词字符串呢?您的正则表达式控制前32个字符,而不关心第33个字符之后的字符。所以第33个字符可以是任何东西 因此: 表示您的字符串可以以任何非单词字符(
\W*
)开头,后跟长度介于4和32之间的单词(\W{4,32}
),之后可能包含任何非单词字符(\W*
)<代码>*表示0或更多重复,它允许您在4到32个字符之间仅输入单词
在代码中,由于正则表达式测试通过,它将获得整个字符串的长度。必须使用单词边界:
>>> expression = '\b\w{4,32}\b'
单词边界
\b
是来自\w
的字符与其他字符(不是来自\w
,包括字符串的开头和结尾)之间的零宽度限制必须使用单词边界:
>>> expression = '\b\w{4,32}\b'
单词边界
\b
是\w
中的一个字符和另一个字符(不是\w
,包括字符串的开头和结尾)之间的零宽度限制如果您不想匹配超过n个字符,还可以添加负前瞻断言“\w{4,32}(?!\w)'对于32个单词字符后跟非单词字符的字符串呢?还是以非单词开头,后跟32个单词字符?在这种情况下,您的正则表达式将失败。@AndreyShokhin如果您的方法以非单词开头,后跟21个eord字符,则将失败。@FallenAngel:试试这个:re.match('\w{4,32}(?!\w)','a'*32+'#')-它可以工作@Andreyshokhin关于'#'+'a'*32
呢?这些以非单词后跟32个单词字符开头?如果您不想匹配超过n个字符,您还可以添加负前瞻断言“\w{4,32}(?!\w)”,那么对于后跟32个单词字符的字符串,如何处理?还是以非单词开头,后跟32个单词字符?在这种情况下,您的正则表达式将失败。@AndreyShokhin如果您的方法以非单词开头,后跟21个eord字符,则将失败。@FallenAngel:试试这个:re.match('\w{4,32}(?!\w)','a'*32+'#')-它可以工作@Andreyshokhin关于'#'+'a'*32
呢?那些以非单词开头,后跟32个单词字符的字符?\b
不会处理\w
和\w
字符之间没有边界字符的情况,例如32aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa不会处理\w
和\w
字符之间没有边界字符的情况,例如32aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。