Python 正则表达式未匹配行末

3 投票
2 回答
1664 浏览
提问于 2025-04-17 04:00

我正在尝试用一个比较复杂的正则表达式来匹配C/C++的函数定义。不过我发现有一个情况没有匹配上,我想弄明白为什么。这里是一个不匹配的输入字符串:

   void Dump(const char * itemName, ofstream & os)

这明显是一个有效的C++方法声明。这里是正则表达式:

   ^[^=+-|#]*?([\w<>]+\s+(?!if|for|switch|while|catch|return)\w+)\s*\([^;=+-|]*$

这个正则表达式主要是想区分其他看起来像方法声明的C语法,也就是那些后面跟着括号的词。

我使用了一个非常有用的Python正则表达式调试工具(http://www.pythonregex.com/),我发现问题出在最后的"$"符号上——如果我把正则表达式最后的$去掉,它就能匹配上上面的函数签名;如果我保留这个$,就匹配不上。这里面一定有Python正则表达式的一些特殊之处让我搞不清楚。谢谢。

相关问题:

2 个回答

1

在使用PythonRegex时,输出结果可能会让人有些误解。你会发现,r.groups()r.findall()的结果是一样的,都是u'void Dump',这其实是第一个捕获组的内容。如果它显示的是整个匹配结果,你会发现,当你去掉$时,其实你只匹配到了

void Dump(

...并不是你想要的整个函数定义。造成这个问题的原因(正如Greg所解释的)是你最后一个字符类里有语法错误。你需要通过把连字符放在最前面([^-;=+|])或最后([^;=+|-]),或者在它前面加一个反斜杠([^;=+\-|])来转义这个连字符。

我能想到的让PythonRegex显示整个匹配结果的方法,就是去掉所有的捕获组(或者把它们转换为非捕获组)。

4

在你的字符类 [^;=+-|] 中使用 +-| 是在指定一个 范围。这样会导致这个字符类包含的字符(实际上是排除,因为你用了 ^)比你想要的要多得多。如果你想在字符类中指定一个字面上的 -,可以把它放在最前面,比如 [^-;=+|]

撰写回答