使用Python在同一字符串中多次执行re.match()

2024-04-20 09:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我要找到一个正则表达式: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

Tags: reformat密码hellovaluetag模式verilog
2条回答

你看过the ^{} module docs了吗?除了re.match(从字符串开始显式搜索)之外,还有re.findall(查找模式的所有不重叠的出现),以及编译的RegexObject的方法matchsearch,这两个方法都接受开始和结束位置以限制要考虑的字符串部分。另请参见split,它返回按模式拆分的子字符串列表。根据您想要的输出方式,其中一个可能会有所帮助。

是的,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应该更有效率。

相关问题 更多 >