2015-08-14 3 views
1

Я создаю серию фильтров, чтобы проверить строки, содержащие авторские права, и я изо всех сил пытаюсь найти соответствующее регулярное выражение для их соответствия.Regexp для проверки авторских прав

Строки могут прийти двумя путями:

// Copyright (c) YYYY - 2015. 
// Copyright (c) 2015. 

* YYYY может относиться к любой цифре

Я планирую использовать re.match(), однако, если у вас есть какие-либо лучшее предложение, я бы оценить это также.

+0

Вы заботитесь о значении года? Минимум 2000 или что-то еще? Если я не думаю, что '// Copyright \ (c \) (\ d {4} \ s * - \ s *)? \ D {4}' будет делать это (также escape '/', если это разделитель). – chris85

+0

Значение первого года на самом деле не так важно, оно должно быть всего 4 цифры. Второй год, однако, всегда будет в текущем году, поэтому было бы здорово настроить решение, чтобы, возможно, получить это значение от переменной. – pabloxrl

+0

Вы должны иметь возможность сделать эту переменную, а не просто конкатенировать ее с регулярным выражением. Я не знаю python, хотя и не могу сказать, как это сделать. В php это будет нечто вроде 'preg_match ('~ // Авторское право \ (c \) (\ d {4} \ s * - \ s *)?'. $ Year. '~','.'preg_match' - это функция, которая проверяет соответствие регулярных выражений, а' ~ '- разделители. – chris85

ответ

1

насчет

import datetime, re 
reg = re.compile(r'//\s*Copyright\s*\(c\)\s*([0-9]{4})(?:\s*\-\s*%d)?\.' % datetime.date.today().year, re.I) 
reg.match('// copyright (c) 1997 - 2015').group(1) # 1997 

Пожалуйста, обратите внимание, что я не использую \d, потому что он соответствует широкий диапазон Unicode числовых цифр, которые не являются 0-9.

+0

Спасибо за ваш ответ, и я буду выбирать его как ответ, основанный на полноте. @buckley также дал хороший ответ, но я выберу вас за его – pabloxrl

1

Здесь вы идете

// Copyright \(c\) \d{4}(- \d{4})?. 
+0

Спасибо! Однако второй \ d {4} всегда будет соответствовать текущему году (2015 и т. Д.). Есть ли способ указать это через переменную, в которой я мог бы хранить год назад и пытаться ее сопоставить? – pabloxrl

+0

@pabloxrl Вот что я сделал в [моем ответе] (http://stackoverflow.com/a/32010038/180709). – zopieux

+0

@pabloxrl Вы не можете овладеть текущим годом чистым регулярным выражением. Примените свой язык программирования, чтобы сделать замену. – buckley

0

Основная проблема здесь - формат авторских прав. Если вы связываете условия только с двумя строками в своем ответе, то это легко, как показано в ответах выше.

Но если вы попытаетесь пойти глубже, вы столкнетесь с несколькими проблемами. Давайте переформулируем задачу: «Для данной строки авторского права A определите, является ли A действительной линией авторского права или нет».

Во-первых, мы должны заметить, что в соответствии с US Copyright law, если вы используете уведомление об авторских правах (обратите внимание, что это не обязательно!), То вы должны использовать все три следующих:

  1. символ Copyright или «Авторское право» слово , или короткая версия "Copr."
  2. Год первой публикации (или нескольких лет). Таким образом, все эти годы являются действительными: «2015», «2010-2015», «2005, 2009, 2010-2013, 2015»
  3. Имя владельца авторских прав.

И эти три могут пойти в любом порядке, на самом деле. Я предполагаю, что в полной форме решить эту задачу практически невозможно, используя regexp. Но даже если вы связали годы с одним или двумя, разделенными тире, это будет все еще очень сложное регулярное выражение.

Во-вторых, даже если вы написали «идеальный детектор авторских прав», когда вы примените его к файлам \ линиям, которые вы хотите проверить, если будете удивлены. Потому что, если вы проверяете не пару файлов \ lines, а десятки тысяч, вы увидите, что разработчикам контента не очень нравится формат. Начиная с простых вопросов, таких как не использовать имя владельца авторских прав («Авторское право (C) 2015») и до использования дополнительного уведомления («Все права защищены»), меняя регистр букв («авторское право» или «Авторское право»), разные (2010-2015 гг.), «2010» (2015) «OMG, 2010 - 2015» с дополнительными пробелами и т. д.) и многих других случаях.

Смежные вопросы