我正在尝试为PLY创建一个python正则表达式,它将匹配表单的注释
// some comment
和
/* comment
more comment */
所以我试过
t_COMMENT = r'//.+ | /\*.+\*/'
但这不允许多行注释,当我尝试使用'dot matches all'选项解决此问题时,如
t_COMMENT = r'//.+ | (?s) /\*.+\*/'
它导致'//'注释类型匹配许多行。此外,如果我尝试有两个单独的正则表达式,如
t_COMMENT = r'//.+'
t_COMMENT2 = r'(?s) /\*.+\*/'
'//'注释类型仍匹配多行,就好像点匹配所有选项一样。
有人知道如何解决这个问题吗?
答案 0 :(得分:4)
以下正则表达式会匹配这两种评论,
(?://[^\n]*|/\*(?:(?!\*/).)*\*/)
>>> 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)*?*/)|(//.*)