Python正则表达式不匹配行尾

时间:2011-10-10 01:18:15

标签: python regex

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

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

这显然是一个有效的C ++方法声明。这是RE:

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

这基本上试图区分看起来像方法声明的其他C语法,即具有单词后跟paransheses的语法。

使用非常有用的Python正则表达式调试器(http://www.pythonregex.com/)我将其缩小到尾随“$” - 如果我删除正则表达式中的尾随$,它匹配上述方法签名;如果我留在$,它不会。必须有一些Python RE的特性,这是我在这里躲避的。感谢。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

PythonRegex的输出有些误导。 r.groups()r.findall()的结果都是相同的:u'void Dump',这是第一个捕获组的内容。如果它显示了整个匹配项,那么当您删除$时,您只会看到匹配

void Dump(

...不是你想要的整个功能定义。原因(正如Greg解释的那样)是你上一个字符类中的语法错误。您需要首先列出连字符([^-;=+|])或最后一个([^;=+|-]),或者添加反斜杠([^;=+\-|])来转义连字符。

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