Как оценить параметры регулярного выражения (найти более строгую версию)? - PullRequest
1 голос
/ 28 февраля 2020
pattern = '(0*10{1,5}1)'
m = re.search(pattern, '00010000010000')
print(m.group(0)) #result: 0001000001

(0*) означает любое число от 0, (0{1,5}) означает количество нулей от 1 до 5.

В представленном примере регулярное выражение соответствует strng 0001000001. Он содержит 3 нуля в начале (0*) и 5 нулей после первого вхождения 1 (0{1,5}). Точное регулярное выражение будет (0{3}10{5}1). Как найти эту более строгую версию (regex2), которая дает тот же результат с данными и regex1?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Вы можете получить 0 групп с помощью

pattern = '((0*)1(0{1,5})1)'
m = re.search(pattern, '00010000010000')

Затем построить свой строгий шаблон с помощью

strict_pattern = f'(0{{{len(m[2])}}}*10{{{len(m[3])}}}1)'

print(strict_pattern)  # result: (0{3}*10{5}1)
0 голосов
/ 28 февраля 2020

Регулярное выражение - код , выполняемое двигателем. С циклами, возвратами, исключениями, ...

Помимо специальных форм, каждый символ является инструкцией: "Match".

Следовательно, наиболее эффективное регулярное выражение, соответствующее 00010000010000: 00010000010000

Псевдокодовые эквиваленты:

/* 00010000010000 */
read(0);
read(0);
read(0);
read(1);
read(0);
read(0);
read(0);
read(0);
read(0);
read(1);
read(0);
read(0);
read(0);
read(0);

/* 0{3}10{5}1 */
i=0
{read(0); i = i+1; if(i!=3) repeat;}
read(1);
i=0
{read(0); i = i+1; if(i!=5) repeat;}
read(1);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...