在C风格的字符串/注释之外匹配

时间:2014-01-06 09:20:31

标签: python regex

使用正则表达式可以要求匹配不在:

之内
  • C风格的双引号字符串(其中\是转义字符);
  • 单行//评论;
  • 多行/**/评论。

因此,如果我正在搜索foo,我希望

bar("// foo\"", foo, /* foo // */ 2, 3); // foo

仅匹配第二个实例。单独地,单独匹配积极条件不是问题:

  • 双引号字符串:"((?:[^"\\]|\\.)*)";
  • 单行注释://(?:.*?);
  • 用于多行评论:/\*(?:.*?)\*/

但是我不确定如何将所有这些始终如一地组合(然后如何随后否定条件)。如果//不在双引号字符串中,则re是单行注释。与多行评论类似。

我正在使用Python的{{1}}模块进行匹配。

1 个答案:

答案 0 :(得分:0)

你到底想要实现什么目标?使用正则表达式肯定可以做到这一点,但看起来你试图通过返回 not 注释的所有内容来从C代码中删除注释。一种更简单的方法可能是使用re.sub将与注释匹配的任何内容替换为空字符串。然后你可以使用你已经开发的正则表达式:

mycode = ...
patterns = [r'"((?:[^"\\]|\\.)*)"', r'//(?:.*?)', r'/\*(?:.*?)\*/']
for pattern in patterns:
    mycode = re.sub(pattern, '', mycode)

此代码未经过测试,我怀疑当您在多行文档上测试时,您的正则表达式会遇到问题。具体来说,请查看re.M标记以及^$表达式。您也不需要非捕获括号。