0

这是一个快速的问题:

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

我有这个正则表达式:

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

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

那么这可能吗,我可以做类似的事情吗

regex.findall(myStringString, myMatchString)

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

更多说明:我想这样做:

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

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

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

谢谢阅读

4

2 回答 2

1

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

由于您所做的不一定是重新使用相同的模式,那么您最好让re系统缓存模式(它缓存n很多 - 但不记得到底有多少),然后re.findall(...)重新使用 /whatever 你的正则表达式每一次。

于 2013-06-25T21:57:43.833 回答
1

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

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

这将在字符串列表中多次应用您的匹配项,而您的正则表达式只编译一次。

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

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

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

于 2013-06-25T22:00:12.483 回答