2013-12-18 1 views
1

Когда я пытаюсь совместить длину строки с помощью regex \w{m,n}, она не соответствует строкам с длиной ниже m, как и ожидалось, но соответствует строкам с длиной выше n.{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 

Почему так происходит? Как его использовать?

ответ

4

match соответствует по умолчанию в начале строки, но он также не привязывается к концу. Регулярное выражение совпадает с первым 32 a s во втором случае. Я думаю, что вы хотели:

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

(Причина len(output.string) еще 100, потому что это как раз относится к строке, что регулярное выражение сопоставляется, а не той части, что он на самом деле соответствует Вы можете использовать m.group(0) найти. реальный матч.)

+1

Если вы не хотите соответствовать более чем n символам, вы также добавляете отрицательное выражение lookahead '\ w {4,32} (?! \ W)' –

+0

Что относительно строки, которая содержит 32 слова, за которыми следует не-слово персонаж? Или начинается с не-слова и сопровождается 32 символами слова? в этом случае ваше регулярное выражение будет терпеть неудачу. – FallenAngel

+0

@AndreyShokhin ваш подход завершается с ошибкой, если он начинается с не-слова, за которым следуют 21 символ орда. – FallenAngel

0

Ожидается, что вход будет от 4 до 32 символов. Но как насчет строк только слова, длина которых превышает 32 символа? Ваше регулярное выражение управляет первыми 32 символами и не заботится о персонажах после 33-го. Так что 33-й персонаж может быть чем угодно.

Итак:

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

означает, ваша строка может начинаться с любого не слова характера (\W*), а затем слов с длиной от 4 до 32 (\w{4,32}) и может содержать любой не-слово символ после это (\W*). * означает 0 или более повторений, и это позволяет вам вводить только слово только между 4 и 32 символами.

В вашем коде, так как ваш тест регулярного выражения проходит, он получает длину всей строки.

1

Вы должны использовать границы слова:

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

слово граница \b является нулевой ширины предел между персонажем из \w и другого характера (не из \w, включая начало и конец строки)

+0

'\ b' не будет обрабатывать ситуации, когда между символами' \ w' и '\ W' символы границ отсутствуют, например' 32aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa – FallenAngel

+0

@FallenAngel: Ваш пример неверен, так как '\ w' тоже содержит цифры. –

+0

Opps мой плохой .... Быстрая ошибка ответа ... – FallenAngel

Смежные вопросы