我有一个正则表达式来寻找: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)
是的,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应该更高效.
| 归档时间: |
|
| 查看次数: |
7708 次 |
| 最近记录: |