Skip to main content
 首页 » 编程设计

python之正则表达式在几种情况下匹配版权声明中的公司名称

2024年08月14日53kerrycode

我的时间很紧,想出一个 python 正则表达式来匹配许多可能的不同版权声明中的公司名称,例如:

Copyright © 2019 Apple Inc. All rights reserved.   
© 2019 Quid, Inc. All Rights Reserved.   
© 2009 Database Designs   
© 2019 Rediker Software, All Rights Reserved   
©2019 EVOSUS, INC. ALL RIGHTS RESERVED   
© 2019 Walmart. All Rights Reserved.   
© Copyright 2003-2019 Exxon Mobil Corporation. All Rights Reserved.   
Copyright © 1978-2019 Berkshire Hathaway Inc.   
© 2019 McKesson Corporation   
© 2019 UnitedHealth Group. All rights reserved.   
© Copyright 1999 - 2019 CVS Health   
Copyright 2019 General Motors. All Rights Reserved.   
© 2019 Ford Motor Company   
©2019 AT&T Intellectual Property. All rights reserved.   
© 2019 GENERAL ELECTRIC   
Copyright ©2019 AmerisourceBergen Corporation. All Rights Reserved.   
© 2019 Verizon   
© 2019 Fannie Mae   
Copyright © 2018 Jonas Construction Software Inc. All rights reserved.   
All Comments © Copyright 2017 Kroger | The Kroger Co. All Rights Reserved   
© 2019 Express Scripts Holding Company. All Rights Reserved. 1 Express Way, St. Louis, MO 63121   
© 2019 JPMorgan Chase & Co.   
Copyright © 1995 - 2018 Boeing. All Rights Reserved.   
© 2019 Bank of America Corporation. All rights reserved.   
© 1999 - 2019 Wells Fargo. All rights reserved. NMLSR ID 399801   
©2019 Cardinal Health. All rights reserved.   

我对正则表达式的了解只是非常基本的东西,目前还不足以快速想出一个好的解决方案。

在我看来,至少对于这些示例,正确捕获公司名称的要求如下:

If there's a '©' or 'Copyright' in the sentence: 
    After '©' or 'Copyright' - look for a year, e.g. '2019', or a year range, e.g. '1995 - 2018' or '2003-2019' (spaces are to catch as well]): 
        If there's a dot somewhere after this year/year range, capture  the text until the dot. E.g. in 'Copyright © 1978-2019 Berkshire Hathaway Inc.' capture 'Berkshire Hathaway Inc' 
        If there's no dot but there's the sentence 'All rights reserved', capture from the year/year range until there and also ignore any possible non-alphanumeric characters that precede it, such as spaces and commas. E.g. from '© 2019 Rediker Software, All Rights Reserved' capture 'Rediker Software' 
        If there's no dot nor the sentence 'All rights reserved', capture from the year/year range until the end. E.g. from '© 2019 Verizon' Capture 'Verizon' 

有什么关于好的正则表达式的建议吗?

请您参考如下方法:

你可以考虑像这样的正则表达式

(?i)(?:©(?:\s*Copyright)?|Copyright(?:\s*©)?)\s*\d+(?:\s*-\s*\d+)?\s*(.*?(?=\W*All\s+rights\s+reserved)|[^.]*(?=\.)|.*) 

参见 regex demo .使用不区分大小写的修饰符,re.I与它。

详情

  • (?:©(?:\s*Copyright)?|Copyright(?:\s*©)?) - 任何一个
    • ©(?:\s*Copyright)? - © char 后跟一个可选的 0+ 空格子字符串,然后是 Copyright
    • | - 或者
    • Copyright(?:\s*©)? - Copyright后跟可选的 0+ 空格子串和 ©字符
  • \s* - 0+ 个空格
  • \d+ - 1+ 位数字(如果年份始终包含 4 位数字,则使用 \d{4})
  • (?:\s*-\s*\d+)? - - 的可选序列用 0+ 个空格和 1+ 个数字括起来(如果年份始终包含 4 位数字,请使用 \d{4})
  • \s* - 0+ 个空格
  • (.*?(?=\W*All\s+rights\s+reserved)|[^.]*(?=\.)|.*) - 捕获第 1 组:任何备选方案:
    • .*?(?=\W*All\s+rights\s+reserved) - 除换行符以外的任何 0+ 个字符,尽可能少,直到 0+ 个非单词字符后跟 All rights reserved字符串
    • [^.]*(?=\.) - 除 . 以外的任何 0+ 个字符尽可能多到 .不包括 .
    • .* - 其余部分

Python demo :

import re 
s = "Copyright © 2019 Apple Inc. All rights reserved.\r\n© 2019 Quid, Inc. All Rights Reserved.\r\n© 2009 Database Designs \r\n© 2019 Rediker Software, All Rights Reserved\r\n©2019 EVOSUS, INC. ALL RIGHTS RESERVED\r\n© 2019 Walmart. All Rights Reserved.\r\n© Copyright 2003-2019 Exxon Mobil Corporation. All Rights Reserved.\r\nCopyright © 1978-2019 Berkshire Hathaway Inc.\r\n© 2019 McKesson Corporation\r\n© 2019 UnitedHealth Group. All rights reserved.\r\n© Copyright 1999 - 2019 CVS Health\r\nCopyright 2019 General Motors. All Rights Reserved.\r\n© 2019 Ford Motor Company\r\n©2019 AT&T Intellectual Property. All rights reserved.\r\n© 2019 GENERAL ELECTRIC\r\nCopyright ©2019 AmerisourceBergen Corporation. All Rights Reserved.\r\n© 2019 Verizon\r\n© 2019 Fannie Mae\r\nCopyright © 2018 Jonas Construction Software Inc. All rights reserved.\r\nAll Comments © Copyright 2017 Kroger | The Kroger Co. All Rights Reserved\r\n© 2019 Express Scripts Holding Company. All Rights Reserved. 1 Express Way, St. Louis, MO 63121\r\n© 2019 JPMorgan Chase & Co.\r\nCopyright © 1995 - 2018 Boeing. All Rights Reserved.\r\n© 2019 Bank of America Corporation. All rights reserved.\r\n© 1999 - 2019 Wells Fargo. All rights reserved. NMLSR ID 399801\r\n©2019 Cardinal Health. All rights reserved.\r\n© 2019 Quid, Inc All Rights Reserved." 
rx = r"(?:©(?:\s*Copyright)?|Copyright(?:\s*©)?)\s*\d+(?:\s*-\s*\d+)?\s*(.*?(?=\W*All\s+rights\s+reserved)|[^.\n]*(?=\.)|.*)" 
for m in re.findall(rx, s, re.I): 
    print(m) 

输出:

Apple Inc 
Quid, Inc 
Database Designs  
Rediker Software 
EVOSUS, INC 
Walmart 
Exxon Mobil Corporation 
Berkshire Hathaway Inc 
McKesson Corporation 
UnitedHealth Group 
CVS Health 
General Motors 
Ford Motor Company 
AT&T Intellectual Property 
GENERAL ELECTRIC 
AmerisourceBergen Corporation 
Verizon 
Fannie Mae 
Jonas Construction Software Inc 
Kroger | The Kroger Co 
Express Scripts Holding Company 
JPMorgan Chase & Co 
Boeing 
Bank of America Corporation 
Wells Fargo 
Cardinal Health 
Quid, Inc