我正在编写一个小助手脚本来分析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*)
唯一可以匹配的空间。