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

时间:2013-06-25 21:50:15

标签: python regex pattern-matching

这是一个简单的问题:

如何指定可以多次使用多个匹配字符串的正则表达式?我可能没有措辞,但我会尝试展示一些代码。

我有这个正则表达式:

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

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

这是可能的,我可以做一些像

这样的事情
regex.findall(myStringString, myMatchString)
代码中的

或者我是否必须重新编译正则表达式才能匹配新的字符串?

更多说明: 我想这样做:

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

但是因为myMatchString会在循环的每次迭代中发生变化,我想这样做,所以我可以匹配新的字符串:

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

感谢您阅读

2 个答案:

答案 0 :(得分:1)

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

正如你所做的那样而不是必须重新使用相同的模式,那么你最好让re系统缓存模式(它缓存n很多 - 但不记得究竟有多少),每次重新使用re.findall(...) /你的正则表达式。

答案 1 :(得分:1)

好吧,如果我理解你说的话,你想写的就是:

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

这将在字符串列表中应用你的匹配,因为你的正则表达式只编译了一次。

Aaaah ......但你不需要正则表达式:

def match_on_list_of_strings(bigstring, list_of_strings):
    for string in list_of_strings:
        if string in bigstring:
            yield string

或者如果你真的想使用re:

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

然后回答你的问题,不,你不能将目标字符串编译成正则表达式,但恰恰相反。编译正则表达式时,您要做的是将实际正则表达式转换为自动机的内部表示。您可能希望阅读有关NFAregexps

的课程