匹配的空格似乎是非贪婪的
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]
我正在编写一个小的帮助脚本来分析 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]