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);
我同意第二个街区更短。但执行时间也更长,在失败的情况下,需要更多的步骤来回溯