这是一个简单的问题:
如何指定可以多次使用多个匹配字符串的正则表达式?我可能没有措辞,但我会尝试展示一些代码。
我有这个正则表达式:
regex = compile(r'(?=(%s))')
在for循环中,我将尝试匹配我为正则表达式指定的字符串,以便在每次迭代时,我可以更改匹配的字符串,并尝试匹配它。
这是可能的,我可以做一些像
这样的事情regex.findall(myStringString, myMatchString)
代码中的或者我是否必须重新编译正则表达式才能匹配新的字符串?
更多说明: 我想这样做:
re.findall('(?=(%s))' %myMatchString, mySearchString)
但是因为myMatchString会在循环的每次迭代中发生变化,我想这样做,所以我可以匹配新的字符串:
regex = re.compile(r'(?=(%s))')
regex.findall( myMatchString, mySearchString)
感谢您阅读
答案 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
然后回答你的问题,不,你不能将目标字符串编译成正则表达式,但恰恰相反。编译正则表达式时,您要做的是将实际正则表达式转换为自动机的内部表示。您可能希望阅读有关NFA和regexps
的课程