2015-06-15 3 views
-2

предполагая, у меня есть шаблон, напоминающую:Как определяется порядок повторного поиска?

re.compile(r"(pattern1)|(pattern2)|...|(patternN)") 

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

Как определяется порядок поиска шаблона?

EDIT: Это может быть проблемой для моего регулярного выражения, но поскольку он довольно длинный, я хочу убедиться, что мое предположение о методе поиска верное.

+3

Что вы подразумеваете под 'но результаты доказали обратное .'? –

+0

Можете ли вы показать пример, демонстрирующий результаты «в противном случае»? – BrenBarn

+0

Кажется, что он проходит через определенные шаблоны соответствия в пользу шаблона, расположенного дальше (справа). –

ответ

1

Порядок поиска слева направо на строку поиска ; затем слева направо по шаблону для той же начальной позиции в искомой строке. Таким образом, если вы ищете r"b|c" в "dcba", "c" найден первый, так как он ближе всего к началу "dcba" чем "b".

Но, если вы ищете r"..a|.b", "cba" встречается, а не "cb", поскольку они начинают в том же положении, но ..a альтернатива рано в шаблоне.

+0

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

+3

@Verbal_Kint сообщение regex .. –

+1

Как говорит Авинаш Радж; все, что я могу сделать, это догадаться о том, что вы делаете, и дать очень общий ответ, если вы не опубликуете подробности о том, что вы делаете. – Amadan

1

re.search возвращает только первое совпадение.

Скажите, например.

x="hi hello" 
print re.search(r"(hello)|(hi)",x).groups() 

Здесь выход будет hi и не hello. Read here

о match против search .search будет искать строку, начиная с h и будет соответствовать hi первым.

+0

Первое совпадение - это желаемое поведение, кажется, что есть проблема с моим регулярным выражением –

+0

@Verbal_Kint, тогда на него можно ответить лучше, если вы можете опубликовать точную строку и вывод – vks

+0

У меня есть ответ, который я искал, просто вернуться через регулярное выражение и как контуры контуров шаблонов, поскольку слева направо - порядок поиска –