匹配的空格似乎是非贪婪的

matching whitespace seems to be non-greedy

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

的字符

我把我的问题归结为这个 MWE:

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

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

MWE 不应在我的书中产生匹配项。但是,确实如此,如果我查看 match.groups(),我会得到

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

意味着 \s* 匹配零个白色 space 字符。从文档中我希望它匹配字符串中 *foo 之前的单个 space 因为 * 量词应该贪婪地匹配零个或多个字符。

[ \t]甚至 *交换\s(注意space)也没有什么不同。

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

我会使用这个正则表达式:

(?:struct foo\s*)([^*\s]+)

如果没有提供星号,这将 return 显示空格后的内容。

示例: struct foo *bar 不会 return 什么。
struct foo bar 会 return bar.

这里测试和解释:https://regex101.com/r/dVeHc3/1

(\s*) 正确匹配零个 space。 [^*] 无法与文本中的 * 匹配,因此它应该与前一个字符匹配,这是 (\s*) 可以匹配的唯一可用的 space .

我想您只是想确保最后的字符组不匹配 space 个字符。所以你想要:

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