Python 正则表达式未匹配行末
我正在尝试用一个比较复杂的正则表达式来匹配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
在你的字符类 [^;=+-|] 中使用 +-| 是在指定一个 范围。这样会导致这个字符类包含的字符(实际上是排除,因为你用了 ^)比你想要的要多得多。如果你想在字符类中指定一个字面上的 -,可以把它放在最前面,比如 [^-;=+|]。