2015-04-13 6 views
1

В чем разница между/(a ​​+) + c/и/(a ​​+) c/in re модулем? Я проверил, сколько времени потребуется для выполнения. Была большая разница. Я хочу знать, почему существует большая разница. Я ввел этот образец в форму онлайн-тестера регулярных выражений, но я не понял, что происходит. Пожалуйста, скажите мне слова.жадный и жадный в модуле

import re 
from time import clock  
def test(f, *args, *kargs): 
    start = now() 
    f(*args, *kargs) 
    print("The function %s lasted: %f" % (f.__name__, now() - start)) 

def catastrophic1(n): 
    print("Testing with %d characters" % n) 
    pat = re.compile("(a+)+c") 
    text = "%s" % 'a' * n 
    pat.search(text) 

def catastrophic2(n): 
    print("Testing with %d characters" % n) 
    pat = re.compile("(a+)c") 
    text = "%s" % 'a' * n 
    pat.search(text) 

for n in range(13, 20): 
    test(catastrophic1, n) 
for n in range(13, 20): 
    test(catastrophic2, n) 
+0

Почему у вас есть '/ (a +) + c /' в вашем вопросе и '(a +) + c' в вашем коде? Если это ошибка, отредактируйте свой вопрос. –

+0

Использовать [timeit] (https://docs.python.org/2/library/timeit.html) в качестве предпочтения к часовому коду времени ... – dawg

+0

@ user5061 Если он не подходит, то не будет разницы – q2ven

ответ

1

оба выражения совпадают то же самое, а именно один или несколько a с последующим одним c.

Выражение (a+)+c занимает больше времени для обработки движка регулярного выражения, поскольку существует больше способов, чтобы строка из a s соответствовала этому выражению.

Например, используя второе выражение, строка aaaaaa может быть разбита на следующие группы

(a)(a)(a)(a)(a)(a) # here (a+) matches a single 'a' 
(aa)(aa)   # here (a+) matches 'aa' 
(aaa)(aaa)   # here (a+) matches 'aaa' 
+0

only only groups? –

1

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

На самом деле питон движок регулярных выражений использует Traditional NFA для своих регулярных выражений спичек и на основе сущности двигателя NFA, что:

он рассматривает каждый подвыражению или компонент, в свою очередь, и всякий раз, когда он должен выбирать между двумя одинаково жизнеспособными вариантами , он выбирает один и запоминает другой, чтобы вернуться к нему позже, если потребуется. Ситуации, в которых он должен принимать решения среди курсов действий, включают в себя что-либо с квантификатором (решайте, следует ли повторять другой матч) и чередование (решите, что изменить родной, чтобы попробовать, и который оставить на потом). Какой бы путь действия не предпринимался, если он успешный, а остальное регулярное выражение также успешное, матч завершен. Если что-либо в остальном регулярном выражении в конечном итоге вызывает сбой, механизм регулярных выражений знает, что он может вернуться к тому, где он выбрал первый вариант, и продолжить игру, попробовав другой вариант. Таким образом, он в конце концов пробует все возможные перестановки регулярных выражений (или, по крайней мере, столько, сколько необходимо, пока не будет найдено совпадение). *

И помимо предыдущих процессов для + регулярных выражений будет пытаться все комбинации предыдущего шаблона с длиной 1 или более для шаблона, такого как (a+)+c, мы имеем экспоненциальное число попыток! и он будет сожрать много времени!


* Регулярные выражения, Третье издание, Джеффри Е. Ф. Фридль!

+0

Да, но это еще не все. Помимо всех возможных комбинаций групп для n символов вам необходимо учитывать, что шаблон не привязан, поэтому вы можете добавить все комбинации для символов n-1, n-2 и т. Д., Потому что шаблон будет проверяться на каждом положение в строке. –

+0

Да, конечно, все комбинации для 'n-1',' n-2', ... являются основным эффектом дополнительного '+'! – Kasramvd

+1

Нет, я имел в виду, что образец сначала тестируется в позиции 0 (проверьте все комбинации и сбой), затем со смещением 1 (idem), смещением 2 и т. Д. Поведение будет отличаться: '^ (a +) + c' где тестируются только комбинации из смещения 0. * (но потребуется слишком много времени) * –

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

  • Нет связанных вопросов^_^