匹配空白似乎不是贪婪的



我正在编写一个小助手脚本来分析C代码,尤其是结构的使用。我在检测结构何时用作值而不是指针时遇到问题。这意味着我想检测文本struct foo后面是否有任意数量的空白和不是*的字符。

我把我的问题归结为MWE:

>>> import re
>>> there = re.compile('struct foo(\s*)[^*]')
>>> match = there.search('struct foo *bar')

注意。我需要使用双反斜杠,因为我不能在应用程序中使用原始字符串。实际上我需要一个f字符串

MWE不应该在我的书中产生匹配。然而,它确实存在,如果我查看match.groups(),我会得到

>>> match.groups()
('',)

意味着CCD_ 4与零个空白字符匹配。根据文档,我希望它与字符串中*foo之前的单个空格匹配,因为*量词应该贪婪地匹配零个或多个字符。

\s[ t]甚至*(注意空格(交换也没有区别。

为什么\s*在存在空格的情况下似乎匹配零个字符?

我认为您只想确保最后一个字符组不匹配空格字符。所以你想要:

struct foo(\s*)[^*\s]

我将使用以下正则表达式:

(?:struct foos*)([^*s]+)

如果没有提供星号,这将返回空格后面的内容。

示例:struct foo *bar将不返回任何内容
struct foo bar将返回bar

测试和解释如下:https://regex101.com/r/dVeHc3/1

(\s*)正确匹配零空格。[^*]不能与文本中的*匹配,因此它应该与前一个字符匹配,这是(\s*)唯一可以匹配的空间。

最新更新