我正在尝试在代码中捕获两种类型的注释。注释的类型为/../和//...
我的模式:r'(/ *。?* /)|(//.?)/'
上面的模式没有捕获两个相似的多行注释组(/ ** /)。如果它们之间用单行注释组(// ...)隔开。
此模式有什么问题?
p=re.compile(r'(/\*.*?\*/)|(//.*?)/')
s='/*first multiline*/ //other comment /*second multiline*/'
expected:
["/*first multiline*/",""]
["","//other comment "]
["/*second multiline*/",""]
Actual:
["/*first multiline*/",""]
["","//other comment "]
注意:我知道这不适用于跨越多行的注释。我只是想了解给定输入的上述模式的问题
答案 0 :(得分:0)
使用此:
re.compile(r'(/\*.*?\*/)|(//[^/\r\n]+)', re.DOTALL)
演示:https://regex101.com/r/T4cM98/3
问题是第二个捕获组拿下您假定的比赛的第一个斜杠后的最后一个斜杠:
r'(/\*.*?\*/)|(//.*?)/'
^ here
但是,一旦斜杠被删除,由于非贪婪的?
表示法,它将不会捕获双精度//
以外的任何内容,因此,请仅匹配非/
的所有内容在//
之后。
编辑:用//[^/\r\n]+
更新,并按照Wiktor的建议重新点播。