是否可以在使用贪婪字符时重新找到最小匹配

Dav*_*erk 5 python regex

免责声明:我不是正则表达专家.

我正在使用Python re模块在许多htm文件上执行正则表达式匹配.其中一种模式是这样的:

<bla><blabla>87765.*</blabla><bla>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,不是找到所有(比如说)五次出现的模式,而是只找到一个.因为它将所有出现的事件焊接成一个,使用<bla><blabla>87765第一次出现的</blabla><bla>部分和页面中最后一次出现的部分.

有没有办法告诉重新找到最小的比赛?

iam*_*ael 14

您可以在模式中使用一个不情愿的限定词(更多详情,请参考Python文档*?,+???运营商):

<bla><blabla>87765.*?</blabla><bla>
Run Code Online (Sandbox Code Playgroud)

或者,<从可能匹配的字符中排除:

<bla><blabla>87765[^<]*</blabla><bla>
Run Code Online (Sandbox Code Playgroud)

只有<blabla>和之间没有儿童标签</blabla>.


G G*_*III 5

Python re 模块支持非贪婪匹配。您只需?在通配符模式的末尾添加一个,例如.*?. 您可以在此 HOWTO 中了解更多信息。

  • 非贪婪匹配不是这个问题的解决方案。尝试模式“first something first second”和模式“first(.*?)second”。即使它是非贪婪的,它仍然会采用它找到的第一个匹配项,即最大的、最左边的匹配项。贪婪只会影响它如何对待每个字符的模式。 (4认同)