我正在编写一个小的帮助程序脚本来分析C代码,尤其是使用结构。我在检测结构何时用作值(而不是指针)时遇到问题。这意味着我想检测文本struct foo
后面是否有任意数量的空格和不是*
的字符。
我将问题归结为该MWE:
>>> import re
>>> there = re.compile('struct foo(\\s*)[^*]')
>>> match = there.search('struct foo *bar')
注意。我需要使用双反斜杠,因为我无法在应用程序中使用原始字符串。我实际上需要一个f弦。
我的书中的MWE 不应该匹配。但是,确实如此,如果我看着match.groups()
,我会得到
>>> match.groups()
('',)
表示\\s*
确实匹配零个空白字符。从文档中,我希望它与字符串中*foo
之前的单个空格匹配,因为*
量词应贪婪地匹配零个或多个字符。
用\\s
甚至用[ \t]
(注意空格)交换 *
也不起作用。
为什么\\s*
似乎在空格处匹配零个字符?
答案 0 :(得分:2)
我认为您只想确保最终字符组与空格字符不匹配。所以你想要:
struct foo(\\s*)[^*\\s]
答案 1 :(得分:1)
我将使用以下正则表达式:
(?:struct foo\s*)([^*\s]+)
如果没有提供星号,它将返回空格之后的内容。
示例:
struct foo *bar
将不返回任何内容。
struct foo bar
将返回bar
。
此处进行测试和解释:https://regex101.com/r/dVeHc3/1
答案 2 :(得分:1)
(\\s*)
正确匹配零空格。 [^*]
无法与文本中的*
相匹配,因此它应该与前一个字符相匹配,前一个字符是(\\s*)
所要匹配的唯一可用空间。