2 ответов:
Регулярное выражение Python для сопоставления однострочных комментариев (только соответствует комментариям, начинающимся с//, а не /* */). К сожалению, это регулярное выражение довольно уродливо, поскольку оно должно учитывать экранированные символы и // внутри строк. Вы должны найти более понятное решение, если вам это когда-нибудь понадобится в реальном коде.
import re pattern = re.compile(r'^(?:[^"/\\]|\"(?:[^\"\\]|\\.)*\"|/(?:[^/"\\]|\\.)|/\"(?:[^\"\\]|\\.)*\"|\\.)*//(.*)$')Это небольшой скрипт, который запускает кучу тестовых строк против шаблона.
import re pattern = re.compile(r'^(?:[^"/\\]|\"(?:[^\"\\]|\\.)*\"|/(?:[^/"\\]|\\.)|/\"(?:[^\"\\]|\\.)*\"|\\.)*//(.*)$') tests = [ (r'// hello world', True), (r' // hello world', True), (r'hello world', False), (r'System.out.println("Hello, World!\n"); // prints hello world', True), (r'String url = "http://www.example.com"', False), (r'// hello world', True), (r'//\\', True), (r'// "some comment"', True), (r'new URI("http://www.google.com")', False), (r'System.out.println("Escaped quote\""); // Comment', True) ] tests_passed = 0 for test in tests: match = pattern.match(test[0]) has_comment = match != None if has_comment == test[1]: tests_passed += 1 print "Passed {0}/{1} tests".format(tests_passed, len(tests))
Я думаю, что это работает (используя pyparsing):
data = """ class HelloWorld { // method main(): ALWAYS the APPLICATION entry point public static void main (String[] args) { System.out.println("Hello World!"); // Nested //Print 'Hello World!' System.out.println("http://www.example.com"); // Another nested // Print a URL System.out.println("\"http://www.example.com"); // A nested escaped quote // Print another URL } }""" from pyparsing import * from pprint import pprint dbls = QuotedString('"', '\\', '"') sgls = QuotedString("'", '\\', "'") strings = dbls | sgls pprint(dblSlashComment.ignore(strings).searchString(data).asList()) [['// method main(): ALWAYS the APPLICATION entry point'], ["// Nested //Print 'Hello World!'"], ['// Another nested // Print a URL'], ['// A nested escaped quote // Print another URL']]Если у вас есть комментарии в стиле
/* ... */, которые имеют однострочные комментарии в них, и на самом деле не хотят их, то вы можете использовать:pprint(dblSlashComment.ignore(strings | cStyleComment).searchString(data).asList())(Как обсуждалось в http://chat.stackoverflow.com/rooms/26267/discussion-between-nhahtdh-and-martega)
Comments