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

2024-10-03 19:32:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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个零。确切的regexp是(0{3}10{5}1)。如何找到这个更严格的版本(regex2),在给定数据和regex1的情况下给出相同的结果


Tags: 数据版本re示例searchgroup情况result
2条回答

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

除了特殊字符外,每个字符都是一条指令:“匹配”

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

我同意第二个街区比较短。但它的执行时间也更长,如果出现故障,需要更多的步骤来回溯

您可以使用

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)

相关问题 更多 >