Python正则表达式与行尾不匹配

Python正则表达式与行尾不匹配,python,regex,Python,Regex,我正在尝试使用相当复杂的正则表达式来匹配C/C++函数定义。我发现了一个不起作用的案例,我正在努力理解原因。以下是不匹配的输入字符串: void Dump(const char * itemName, ofstream & os) 这显然是一个有效的C++方法声明。以下是回复: ^[^=+-|#]*?([\w<>]+\s+(?!if|for|switch|while|catch|return)\w+)\s*\([^;=+-|]*$ ^[^=+-+\s+*?([

我正在尝试使用相当复杂的正则表达式来匹配C/C++函数定义。我发现了一个不起作用的案例,我正在努力理解原因。以下是不匹配的输入字符串:

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

这显然是一个有效的C++方法声明。以下是回复:

   ^[^=+-|#]*?([\w<>]+\s+(?!if|for|switch|while|catch|return)\w+)\s*\([^;=+-|]*$
^[^=+-+\s+*?([\w]+\s+(?!if | for | switch | while | catch | return)\w+\s*\([^;=+-|]*$
这基本上是试图区分其他类似于方法声明的C语法,也就是说,它的单词后跟paratenthes


使用非常有用的Python正则表达式调试器(http://www.pythonregex.com/)我已经缩小到尾随的“$”-如果我在正则表达式中删除尾随的$,它将匹配上面的方法签名;如果我在$中保留,它将不匹配。这里一定有一些Python RE的特性让我无法理解。谢谢。

在字符类
[^;=+-
中使用
是一个范围规范。这将导致字符类包含(实际上排除,因为您使用的是
^
)比您想要的多得多。要在字符类中指定一个文本
-
,请首先像
[^-]=+|]

那样提及它。
r.groups()
r.findall()
都是相同的:
u'void Dump'
,这是第一个捕获组的内容。如果它显示了整个匹配,您会看到当删除
$
时,您只匹配了

void Dump(
…不是您想要的整个函数定义。原因(如Greg所解释)是上一个字符类中的语法错误。您需要先列出连字符(
[^-;=++\-]
)或最后一个(
[^;=+\-]
),或添加反斜杠(
[^;=+\-]
)来转义连字符


我能看到的让PythonRegex显示整个匹配的唯一方法是删除所有捕获组(或将它们转换为非捕获组).

您确实需要一个合适的解析器来正确地完成这类工作。快速搜索建议您可以使用感谢您的建议-这是Code Surveyor的一部分,它是一个快速而肮脏的工具,用于对代码库进行一些分析。我知道在ASTs上工作的真正解析器会更加准确-我在Visual Studio中确实有,但downsi许多解析器的缺点是代码必须实际编译。这允许它在有构建问题的代码库上运行。不过,我将查看您提供的参考。谢谢。