使用Python在同一个字符串中多次重复匹配()

pro*_*eek 3 python regex

我有一个正则表达式来寻找:ABC:`hello`模式.这是代码.

format =r".*\:(.*)\:\`(.*)\`"
patt = re.compile(format, re.I|re.U)
m = patt.match(l.rstrip())
if m:
    ...
Run Code Online (Sandbox Code Playgroud)

当模式在一行中发生一次时它很有效,但是有一个例子":tagbox:`Verilog`:tagbox:`Multiply`:tagbox:`VHDL`".它只找到最后一个.

我怎样才能找到所有这三种模式?

编辑

根据Paul Z的回答,我可以使用这段代码

format = r"\:([^:]*)\:\`([^`]*)\`"
patt = re.compile(format, re.I|re.U)
for m in patt.finditer(l.rstrip()):
    tag, value = m.groups()  
    print tag, ":::", value
Run Code Online (Sandbox Code Playgroud)

结果

tagbox ::: Verilog
tagbox ::: Multiply
tagbox ::: VHDL
Run Code Online (Sandbox Code Playgroud)

Pau*_*l Z 9

是的,dcrosta建议查看re模块文档,这可能是一个好主意,但我打赌你真的想要这个finditer功能.试试这个:

format = r"\:(.*)\:\`(.*)\`"
patt = re.compile(format, re.I|re.U)
for m in patt.finditer(l.rstrip()):
    tag, value = m.groups()
    ....
Run Code Online (Sandbox Code Playgroud)

您当前的解决方案总是找到最后一个解决方案,因为最初的解决方案.*尽可能多地吃,同时仍保留有效匹配(最后一个).顺便说一句,这也可能使你的程序比你需要的速度慢得多,因为.*首先尝试吃掉整个字符串,然后逐个字符地备份,因为剩下的表达式告诉它"太多了,回去".使用finditer应该更高效.