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

2024-04-28 22:49:29 发布

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

免责声明:我不是regex专家。

我正在使用Python re模块对许多htm文件执行regex匹配。其中一种模式是这样的:

<bla><blabla>87765.*</blabla><bla>

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

有没有办法告诉re找到最小的匹配?


Tags: 模块文件re声明模式页面regex专家
3条回答

您可以在模式中使用不情愿的限定符(有关更多详细信息,请参考*?+???运算符上的python documentation):

<bla><blabla>87765.*?</blabla><bla>

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

<bla><blabla>87765[^<]*</blabla><bla>

只有在<blabla></blabla>之间没有子标记时才

Python re模块支持非reedy匹配。只需在通配符模式的末尾添加一个?,例如.*?。你可以在this HOWTO了解更多。

I believe the regex
<bla><blabla>87765.*?</blabla><bla>
can produce catastrophic backtracking.

Instead, use:
<bla><blabla>87765[^<]*</blabla><bla>

Using atomic grouping (I'm not sure Python supports this), 
the above regex becomes 
<bla><blabla>(?>(.*?<))/blabla><bla>

之间的一切?>;…)一旦regex引擎离开组,regex引擎就将其视为一个令牌。因为整个组是一个令牌,所以一旦regex引擎找到组的匹配项,就不能进行回溯。如果需要回溯,引擎必须在组之前回溯到regex标记(在我们的示例中是插入符号)。如果组之前没有标记,则正则表达式必须在字符串的下一个位置重试整个正则表达式。请注意,我需要在组中包含“<;”,以确保原子性。够近了。

相关问题 更多 >