我正在创建一系列过滤器,以便验证包含版权的字符串,并且我很难找到合适的正则表达式来匹配它们。
字符串可以有两种方式:
// Copyright (c) YYYY - 2015.
// Copyright (c) 2015.
* YYYY可以指任何数字
我打算使用re.match()但是如果你有更好的建议,我也会很感激。
答案 0 :(得分:1)
你去吧
// Copyright \(c\) \d{4}( - \d{4})?.
答案 1 :(得分: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。
答案 2 :(得分:0)
这里的主要问题是版权格式。如果你将条件限制在你的答案中只有两行,那么它很容易,如上面的答案所示。
但如果你试图深入,你将面临多个问题。让我们重新制定任务:"对于给定的版权字符串A,定义A是否代表有效的版权行"。
首先,我们应该注意到,根据US Copyright law,如果您使用版权声明(请注意,这不是必需的!),那么您应该使用以下所有三个:
事实上,这三个可以按任何顺序排列。我假设在完整形式下,使用regexp解决此任务几乎是不可能的。但是,即使你用破折号将一年或两年分开,它仍然是非常复杂的正则表达式。
其次,即使您已经编写了完善的版权检测器",当您将其应用于您要检查的文件\行时,是否会感到惊讶。因为如果您不是检查几个文件\行,而是数万个,您会看到内容创建者通常不关心格式。从不使用版权所有者名称("版权所有(C)2015")以及使用附加通知("保留所有权利。")等简单问题开始,更改字母大小写("版权"或"版权所有"),不同年份写作(" 2010 2015" w \ o dash,"(2010)(2015)&# 34; OMG," 2010 - 2015"有额外的空间等)和许多其他案例。
答案 3 :(得分:0)
简单的方法是:
导入重新
re_copyright = re.compile(r' copyright(([[Cc @])| \ d +)。*',re.IGNORECASE) re_copyright.match(文本)
上述正则表达式应该可以从文本变量中获取任何版权声明。