用于匹配单行和多行注释的Python正则表达式。

时间:2014-09-13 11:28:10

标签: python regex

我正在尝试为PLY创建一个python正则表达式,它将匹配表单的注释

// some comment

/* comment
   more comment */

所以我试过

t_COMMENT = r'//.+ | /\*.+\*/'

但这不允许多行注释,当我尝试使用'dot matches all'选项解决此问题时,如

t_COMMENT = r'//.+ | (?s) /\*.+\*/'

它导致'//'注释类型匹配许多行。此外,如果我尝试有两个单独的正则表达式,如

t_COMMENT = r'//.+' 
t_COMMENT2 = r'(?s) /\*.+\*/'

'//'注释类型仍匹配多行,就好像点匹配所有选项一样。

有人知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

以下正则表达式会匹配这两种评论,

(?://[^\n]*|/\*(?:(?!\*/).)*\*/)

DEMO

>>> s = """// some comment
... 
... foo
... bar
... foobar
... /* comment
...    more comment */ bar"""
>>> m = re.findall(r'(?://[^\n]*|/\*(?:(?!\*/).)*\*/)', s, re.DOTALL)
>>> m
['// some comment', '/* comment\n   more comment */']

答案 1 :(得分:2)

根据PLY Doc,可以通过“有条件的lexing”来完成。 与复杂的正则表达式相比,它可能更易读,也更容易调试。 他们提供的示例有点复杂,因为它跟踪嵌套级别和块内的内容。但是,您的情况更简单,因为您不需要所有这些信息。

多行注释的代码应该是这样的:

# I'd prefer 'multi_line_comment', but it appears that 
# state names cannot have underscore in them
states = (
    ('multiLineComment','exclusive'),
)

def t_multiLineComment_start(t):
    r'/\*'
    t.lexer.begin('multiLineComment')          

def t_multiLineComment_end):
    r'\*/'
    t.lexer.begin('INITIAL')           

def t_multiLineComment_newline(t):
    r'\n'
    pass

# catch (and ignore) anything that isn't end-of-comment
def t_multiLineComment_content(t):
    r'[^(\*/)]'
    pass

当然,您必须在常规状态下为//评论制定另一条规则。

答案 2 :(得分:0)

这是Avinash解决方案的一个小变化。

pat = re.compile(r'(?://.*?$)|(?:/\*.*?\*/)', re.M|re.S)

答案 3 :(得分:0)

这可能很有用

 (/\*(.|\n)*?*/)|(//.*)