我有一个正则表达式来寻找:ABC:`hello`模式.这是代码.
format =r".*\:(.*)\:\`(.*)\`"
patt = re.compile(format, re.I|re.U)
m = patt.match(l.rstrip())
if m:
...
当模式在一行中发生一次时它很有效,但是有一个例子“: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
结果
tagbox ::: Verilog
tagbox ::: Multiply
tagbox ::: VHDL
解决方法:
是的,dcrosta建议查看re模块文档,这可能是一个好主意,但我打赌你真的想要finditer功能.试试这个:
format = r"\:(.*)\:\`(.*)\`"
patt = re.compile(format, re.I|re.U)
for m in patt.finditer(l.rstrip()):
tag, value = m.groups()
....
您当前的解决方案始终找到最后一个解决方案,因为最初的.*会尽可能多地吃掉,同时仍然保留有效匹配(最后一个).顺便说一句,这也可能使你的程序比它需要的速度慢得多,因为.*首先尝试吃掉整个字符串,然后逐个字符地备份,因为剩下的表达式告诉它“太多了,回去”.使用finditer应该更高效.
标签:python,regex
来源: https://codeday.me/bug/20190721/1496455.html