如何估计正则表达式参数(找到更严格的版本)


pattern = '(0*10{1,5}1)'
m = re.search(pattern, '00010000010000')
print(m.group(0)) #result: 0001000001

(0*)表示0的任意数目,(0{1,5})表示1到5之间的零的数目。

在提供的示例中,regexp与strng0001000001匹配。它在开始的(0*)处包含3个零,在第一次出现1个(0{1,5})之后包含5个零。精确的正则表达式应该是(0{3}10{5}1)。如何找到这个更严格的版本(regex2(,它在给定数据和regex1的情况下给出相同的结果?

您可以使用获得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)

正则表达式是由引擎执行的代码。使用循环、回溯、异常。。。

除了特殊的字符外,每个字符都是一条指令:"匹配"。

因此,与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);

我同意第二个街区更短。但执行时间也更长,在失败的情况下,需要更多的步骤来回溯

最新更新