{m,n}在m以下不匹配但在n之上匹配。为什么?

时间:2013-12-18 14:28:44

标签: python regex python-2.7

当我尝试使用正则表达式\w{m,n}匹配字符串长度时,它与长度低于m的字符串不匹配,正如预期的那样,但匹配长度超过n的字符串。< / p>

>>> 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

为什么会这样? 我应该如何使用它?

3 个答案:

答案 0 :(得分:4)

默认情况下,

match匹配字符串的开头 - 但它也不会锚定到结尾。正则表达式匹配第二种情况中的前32 a s。我想你想要:

expression = '^\w{4,32}$'

len(output.string)仍然是100的原因是因为它只是引用正则表达式匹配的字符串,而不是它实际匹配的部分。您可以使用m.group(0)来查找真实的匹配。)

答案 1 :(得分:1)

您必须使用字边界:

>>> expression = '\b\w{4,32}\b'

字边界\b是来自\w的字符和另一个字符(不是来自\w)之间的零宽度限制,包括字符串的开头和结尾)

答案 2 :(得分:0)

您希望输入介于4到32个字符之间。但是,只有字的字符串超过32个字符呢?你的正则表达式控制前32个字符,并不关心33号后的字符。所以第33个角色可以是任何东西。

所以:

expression = '\W*\w{4,32}\W*'

表示您的字符串可以以任何非单词字符(\W*)开头,后跟长度介于4和32之间的单词(\w{4,32}),之后可能包含任何非单词字符( \W*)。 *表示重复次数为0或更多,它允许您在4个32个字符之间进行仅字输入

在您的代码中,由于您的正则表达式测试通过,它将获得整个字符串的长度。