【问题标题】:Regexp to validate copyrights正则表达式验证版权
【发布时间】:2015-08-14 12:16:33
【问题描述】:

我正在创建一系列过滤器以验证包含版权的字符串,我正在努力寻找合适的正则表达式来匹配它们。

字符串可以有两种方式:

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

*YYYY 可以指任何数字

我打算使用 re.match() 但如果您有更好的建议,我也将不胜感激。

【问题讨论】:

  • 你在乎年的价值吗?最低2000还是什么?如果不是,我认为// Copyright \(c\) (\d{4}\s*-\s*)?\d{4} 会这样做(如果那是分隔符,也可以转义/)。
  • 第一年的值并不是很重要,它只需要4位数。但是,第二年将始终是当前年份,因此最好调整解决方案以从变量中获取该值。
  • 您应该能够将其设为变量,然后将其连接到正则表达式。我不知道python,所以不能说怎么做。在 php 中,它类似于preg_match('~// Copyright \(c\) (\d{4}\s*-\s*)?' . $year . '~',preg_match 是检查正则表达式匹配的函数,~ 是分隔符。

标签: python regex python-2.7


【解决方案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,因为它匹配范围广泛的非 0-9 的 Unicode 数字。

【讨论】:

  • 感谢您的回答,我将根据完整性选择它作为答案。 @buckley 也提供了一个很好的答案,但我会选择你的而不是他的
【解决方案2】:

给你

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

【讨论】:

  • 谢谢!但是,第二个 \d{4} 将始终与当前年份(2015 年等)匹配。有没有办法通过一个变量来指定它,我可以在其中存储前一年并尝试匹配它?
  • @pabloxrl 这就是我在my answer 所做的。
  • @pabloxrl 您无法以纯正则表达式的方式获取当前年份。使用您的编程语言进行替换。
【解决方案3】:

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

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

首先,我们应该注意到,根据US Copyright law,如果您使用版权声明(请注意,这不是必需的!)那么您应该使用以下所有三个:

  1. 版权符号,或“版权”字,或简称“Copr.”
  2. 首次发布的年份(或几年)。所以所有这些都是有效年份:“2015”、“2010-2015”、“2005、2009、2010-2013、2015”
  3. 版权所有者的姓名。

事实上,这三个可以按任何顺序排列。我认为完整的形式几乎不可能使用正则表达式来解决这个任务。但是即使你用破折号将年份绑定到一两年,它仍然是非常复杂的正则表达式。

其次,即使你写了“完美的版权检测器”,当你将它应用到你想要检查的文件\行时,如果你会感到惊讶。因为如果您检查的不是几个文件\行,而是数万行,您会发现内容创建者通常不太关心格式。从不使用版权所有者名称(“Copyright (C) 2015”)等简单问题开始,到使用附加通知(“保留所有权利。”),更改字母的大小写(“版权”或“版权”),不同写作年限(“2010 2015”不带破折号,“(2010)(2015)”OMG,“2010 - 2015”带额外空格等)和许多其他情况。

【讨论】:

    【解决方案4】:

    简单的方法是:

    重新导入

    re_copyright = re.compile(r'copyright (([Cc@])|\d+).*', re.IGNORECASE) re_copyright.match(文本)

    上述正则表达式应该可以从 text 变量中获取任何版权声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2021-02-24
      • 2014-02-25
      • 2019-06-21
      • 1970-01-01
      相关资源
      最近更新 更多