Python Regexp验证版权

Python Regexp验证版权,python,regex,python-2.7,Python,Regex,Python 2.7,为了验证包含版权的字符串,我正在创建一系列过滤器,我正在努力找到合适的regexp来匹配它们 字符串可以有两种方式: // Copyright (c) YYYY - 2015. // Copyright (c) 2015. *YYYY可以引用任何数字 我计划使用re.match(),但是如果您有更好的建议,我也会非常感激。给您 // Copyright \(c\) \d{4}( - \d{4})?. 那怎么办 import datetime, re reg = re.compile(r'//

为了验证包含版权的字符串,我正在创建一系列过滤器,我正在努力找到合适的regexp来匹配它们

字符串可以有两种方式:

// Copyright (c) YYYY - 2015.
// Copyright (c) 2015.
*YYYY可以引用任何数字

我计划使用re.match(),但是如果您有更好的建议,我也会非常感激。

给您

// Copyright \(c\) \d{4}( - \d{4})?.
那怎么办

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。

这里的主要问题是版权格式。如果将条件绑定到答案中仅有的两行,那么就很容易了,如上面的答案所示

但是,如果你试图深入研究,你将面临多个问题。让我们将任务重新表述为:“对于给定的版权字符串,定义a是否表示有效的版权行”

首先,我们应该注意到,如果您使用版权声明(请注意,这不是必需的!),那么您应该使用以下三项:

  • 版权符号,或“版权”字,或简称“Copr”
  • 第一次出版的年份(或几年)。所有这些都是有效年份:“2015年”、“2010-2015年”、“2005年、2009年、2010-2013年、2015年”
  • 版权所有者的名称
  • 事实上,这三个可以按任何顺序排列。我假设以完整的形式使用regexp几乎不可能解决这个任务。但是,即使您将几年绑定到用dash分隔的一两年,它仍然是非常复杂的regexp


    其次,即使您编写了“perfect copyright detector”,当您将其应用于要检查的文件时,if也会感到惊讶。因为如果您检查的不是几个文件,而是上万个文件,您会发现内容创建者通常不太关心格式。从不使用版权持有人名称(“版权(C)2015”)等简单问题开始,直到使用附加通知(“保留所有权利”)、更改字母的大小写(“版权”或“版权”)、不同年份的书写(“2010-2015”w\o破折号、“(2010)(2015)”OMG、“2010-2015”带额外空格等)以及许多其他情况。

    简单的方法是:

    进口稀土

    re_copyright=re.compile(r'copyright([Cc@])|\d+。*,re.IGNORECASE) re_版权匹配(文本)


    上面的正则表达式应该可以从文本变量中获取任何版权声明。

    您关心年份的值吗?至少2000人左右?如果不是,我想
    //版权\(c\)(\d{4}\s*-\s*)?\d{4}
    会这样做(如果是分隔符,也可以转义
    //code>)。第一年的值其实没那么重要,它只需要4位数字。不过,第二年将始终是当前年份,因此最好调整解决方案,以便从变量中获得该值。您应该能够将该变量设置为变量,然后将其连接到正则表达式。我不懂python,所以说不出怎么做。在php中,它类似于“
    preg\u match”(“~//Copyright\(c\)(\d{4}\s*-\s*)?”.$year.“~”,
    preg\u match
    是检查正则表达式匹配的函数,
    ~
    是分隔符。谢谢!但是第二个\d{4}将始终与当前年份匹配(2015年等等)。有没有办法通过一个变量来指定它,我可以在其中存储前一年并尝试匹配它?@pabloxrl这就是我在中所做的。@pabloxrl您无法用纯正则表达式的方式获得当前年份的a。请使用您的编程语言进行替换。谢谢您的回答,我将选择它作为答案b基于完整性。@buckley也提供了一个很好的答案,但我会选择你的而不是他的