Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python {m,n}做';t在m以下匹配,但在n以上匹配。为什么?_Python_Regex_Python 2.7 - Fatal编程技术网

Python {m,n}做';t在m以下匹配,但在n以上匹配。为什么?

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

当我试图通过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(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。