2014-11-13 4 views
0

Предположим, у меня есть этот шаблон, который я хочу найти [a][a]
Предположим, что текст, на котором я буду проверять мой шаблон-искателя это: [a][a][a][a][a][a][a][a]Каков результат этого регулярного выражения?

Моя модель-искатель будет возвращать эти результаты для первой итерации:

[a][a][a][a][a][a][a][a] 
[a][a] 

Для второй итерации:

[a][a][a][a][a][a][a][a] 
    [a][a] 

другими словами, картина «скачет» на одну позицию вправо.

Я проверил мое регулярное выражение на некоторых регулярных выражений сайтов и то, что я видел, что они пропускают вперед по длине шаблона - визуально будет выглядеть следующим образом:

первой итерации:

[a][a][a][a][a][a][a][a] 
[a][a] 

Второму итерация:

[a][a][a][a][a][a][a][a] 
     [a][a] 

Кто такой человек? Я или веб-сайты? И почему?

+1

второй является правильным, потому что вы не можете наложились результаты. Если вы хотите совпадающие результаты, вам нужно поместить ваш шаблон в группу захвата внутри окна просмотра. –

+0

Обычно regex findall игнорирует перекрытия, как предлагает @CasimiretHippolyte. Это возможно по соображениям производительности. См. «Re.findall» python. – simonzack

+1

@simonzack: нет, это не по соображениям производительности, это просто способ, которым движется regex engine: после достижения позиции в строке он продолжается слева направо. –

ответ

2

Кто такой? Я или веб-сайты?

Сайты

почему?

Поскольку \[a\]\[a\] регулярное выражение будет соответствовать два первых [a][a] во время первой итерации. Для второй итерации он не будет выполнять совпадающее совпадение, которое является вторым [a], которое уже было согласовано во время первой итерации, поэтому третий и четвертый [a] были сопоставлены вместо двух и трех. Используйте lookaheads, чтобы сделать перекрывающиеся захваты.

0

Это зависит от модели.

(\[a\])(?=(\[a\])|$) 

Попробуйте это. Этот шаблон сделает правильный ответ. Посмотрите на спички справа.

http://regex101.com/r/pQ9bV3/7

(\[a\])(\[a\]) 

Это заставит сайты correct.See спички на правой стороне.

http://regex101.com/r/pQ9bV3/8