这是我的正则表达式:
(//\s*.*)|(?s)(/\*(\s*(.*?)\s*)\*/)
我在http://regex101.com/r/yJ0oA6网站上使用下面的文本进行测试。你可以看到一切都很好。但是当输入python代码时我无法捕获目标字符串。
regex_1 = r'(//\s*.*)|(?sm)(/\*(\s*(.*?)\s*)\*/)'
pattern = re.compile(regex_1)
print re.findall(pattern,content)
[('// The variable counter, which is about to be defined, is going\n// to start with a value of 0, which is zero.\nvar counter = 0;\n// Now, we are going to loop, hold on to your hat.\nwhile (counter < 100 /* counter is less than one hundred */)\n/* Every time we loop, we INCREMENT the value of counter,\n Seriously, we just add one to it. */\n counter++;\n// And then, we are done.\n', '', '', '')]
它应该匹配六条评论行,但只返回上面的结果,为什么?我错过了什么吗?
答案 0 :(得分:0)
首先,我不建议使用正则表达式来做到这一点,但如果你知道你在做什么,下面的正则表达式将适合你:
regex_1 = r'(//[^\n]+)|(/\*.+?\*/)'
我清理了一下你的东西。它基本上匹配:
//
直到行尾/* <anything here> */
(非贪心,当然)。 第二种情况需要处理多行,您可以通过在调用re.DOTALL
时指定re.compile
标志来执行此操作:
pattern = re.compile(regex_1, re.DOTALL)
以下是输出:
('// The variable counter, which is about to be defined, is going', '')
('// to start with a value of 0, which is zero.', '')
('// Now, we are going to loop, hold on to your hat.', '')
('', '/* counter is less than one hundred */')
('', '/* Every time we loop, we INCREMENT the value of counter,\n Seriously, we just add one to it. */')
('// And then, we are done.', '')
这正是您在示例中寻找的内容。
答案 1 :(得分:0)
这是由于我所说的是python中的一个错误。来自http://www.regular-expressions.info/modifiers.html
不能仅将正则表达式的一部分应用修饰符的味道将正则表达式中间的修饰符视为错误。 Python是一个例外。在Python中,将修饰符放在正则表达式的中间会影响整个正则表达式。
很遗憾,您无法使用(?sm)
。相反,您可以使用[\s\S]
来匹配换行符:
(//\s*.*)|(/\*(\s*([\s\S]*?)\s*)\*/)
我可能会指出\s*.*
是错误的,因为这会导致//
之后的换行无效。我认为它应该只是//.*
。同样重要的是要注意,这也会在字符串文字中找到注释,所以你必须要小心。