我应该重用已编译的正则表达式吗?

2024-09-29 08:29:28 发布

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

这是一个简单的问题:

如何指定一个正则表达式,它可以多次用于多个匹配字符串?我可能用词不对,但我会试着展示一些代码。在

我有这个正则表达式:

regex = compile(r'(?=(%s))')

在for循环中,我将尝试将必须匹配的字符串与我为正则表达式指定的字符串匹配,以便在每次迭代时,我都可以更改匹配的字符串,它将尝试匹配它。在

这有可能吗,我能做点什么吗

^{pr2}$

在代码中,还是必须重新编译正则表达式才能匹配新字符串?在

更多说明: 我想这样做:

re.findall('(?=(%s))' %myMatchString, mySearchString)

但由于myMatchString在循环的每次迭代中都会发生变化,所以我希望这样做,以便能够匹配新字符串:

regex = re.compile(r'(?=(%s))')
regex.findall( myMatchString, mySearchString)

谢谢你的阅读


Tags: 字符串代码reforregexcompilefindallpr2
2条回答

好吧,如果我明白你说的,你只想写:

def match_on_list_of_strings(list_of_strings):
    regex = compile(r'(?=(%s))')
    for string in list_of_strings:
        yield regex.findall(string)

这将对字符串应用匹配项,因为字符串列表中有字符串的次数相同,而正则表达式只编译了一次。在

啊啊。。。但你不需要正则表达式:

^{pr2}$

或者如果你真的想用re:

def match_on_list_of_strings(bigstring, list_of_strings):
    for string in list_of_strings:
        if re.match('.*'+string+'.*', bigstring):
            yield string

然后回答你的问题,不,你不能将目标字符串编译成正则表达式,但只能相反。编译regex时,要做的是将实际的regexp转换为自动机的内部表示形式。您可能想阅读NFA和{a2}的课程

re.compile的重点是明确声明您将一次又一次地重复使用同一模式,并希望避免任何可能需要的编译。在

因为您所做的是而不是必须使用相同的模式,那么您最好让re系统缓存模式(它缓存n多个-但记不清具体有多少个),每次只需重新使用re.findall(...)/任何正则表达式。在

相关问题 更多 >