[英]Python regular expression not matching end of line
我正在尝试使用相当复杂的正则表达式来匹配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的特性,这是我在这里躲避的。 谢谢。
使用+-|
在你的角色类中[^;=+-|]
是一个范围规范。 这将导致包含(实际排除,因为您正在使用^
)的字符类远远超出您的意图。 要指定文字-
在字符类中,首先提及它,如[^-;=+|]
。
PythonRegex的输出有点误导。 r.groups()
和r.findall()
结果都是相同的: u'void Dump'
,这是第一个捕获组的内容。 如果它显示了整个匹配,你会看到当删除$
你只是匹配
void Dump(
...不是你想要的整个功能定义。 原因(正如Greg解释的那样)是你上一个字符类中的语法错误。 您需要首先列出连字符( [^-;=+|]
)或最后( [^;=+|-]
),或者添加反斜杠( [^;=+\\-|]
)来转义连字符。
我能看到让PythonRegex显示整个匹配的唯一方法是删除所有捕获组(或将它们转换为非捕获组)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.