Skip to main content
 首页 » 编程设计

python之正则表达式在更多条件下匹配版权声明中的公司名称

2024年09月03日26zhwl

一段时间以来,我一直在尝试寻找一个强大的正则表达式来从版权声明中提取公司名称(并且对正则表达式了解不多)。

在这个问题中:Regex to match company names from copyright statements under several conditions

我得到了正则表达式:

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

但是当我尝试更多示例时,我发现这还不够。我想更改它,使其也符合以下条件,同时仍然适用于所有以前的情况:

  1. 请考虑在“©”或“版权”(以最后出现的为准)之前可能出现其他任何内容并忽略它。

例子:

602-226-2389 ©2019 Endurance International Group. 
Copyright 1999 — 2019 © Iflexion. All rights reserved. 
  1. 请注意,在“©”或“版权”之后可能没有年份,但已经有公司名称。

例子:

ISO 9001:2008, ISO/ IEC 27001:2005 © Mobikasa 2019 
  1. 考虑到年份可能出现在“版权”或“©”一词之前(我认为条件 1 也满足这一点)

例子:

© 2019 Copyright arcadia.io. 
2018 © Power Tools LLC 
  1. 如果有|匹配到那里,然后忽略其余部分:

例子:

Copyright 2019 ComputerEase Construction Software | 1-800-544-2530

请您参考如下方法:

你可以使用

(?i)(?:©(?:\s*(?:\d{4}(?:\s*[-—–]\s*\d{4})?)?\s*Copyright)?|Copyright(?:\s*(?:\d{4}(?:\s*[-—–]\s*\d{4})?)?\s*©)?)(?:\s*\d{4}(?:\s*[-—–]\s*\d{4})?)?\s*(.*?(?=\s*[.|]|\W*All\s+rights\s+reserved)|.*\b) 

参见 regex demo

Python代码:

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.\r\n602-226-2389 ©2019 Endurance International Group.\r\nCopyright 1999 — 2019 © Iflexion. All rights reserved.\r\nISO 9001:2008, ISO/ IEC 27001:2005 © Mobikasa 2019\r\n© 2019 Copyright arcadia.io.\r\n2018 © Power Tools LLC\r\nCopyright 2019 ComputerEase Construction Software | 1-800-544-2530\r\n© 2019 3M. 3M Health Information Systems Privacy Policy" 
rx = r'''(?xi) 
(?:©                                        # Start of a group: © symbol 
(?:\s*                                      #  Start of optional group: 0+ whitespaces 
  (?:\d{4}                                  #   Start of optional group: 4 digits 
    (?:\s*[-—–]\s*\d{4})?                   #     0+ spaces, dashes, spaces, 4 digits 
  )?                                        #   End of group 
  \s*Copyright                              #  Spaces and Copyright 
)?                                          #  End of group  
|                                           #  OR  
Copyright                                    
 (?:\s*                                     #  Start of optional group: 0+ whitespaces 
   (?:\d{4}                                 #   Start of optional group: 4 digits 
     (?:\s*[-—–]\s*\d{4})?                  #     0+ spaces, dashes, spaces, 4 digits 
   )?\s*©                                   #   End of group, 0+ spaces, © 
 )?                                         #  End of group 
)                                           # End of group 
(?:\s*\d{4}(?:\s*[-—–]\s*\d{4})?)?          # Optional group, 9999 optionally followed with dash enclosed with whitespaces and then 9999 
\s*                                         # 0+ whitespaces 
(                                           # Start of a capturing group: 
   .*?                                      # any 0+ chars other than linebreak chars, as few as possible, up to... 
    (?=\s*[.|]|                             # 0+ spaces and then | or ., or 
        \W*All\s+rights\s+reserved)         # All rights reserved with any 0+ non-word chars before it 
  |                                         # or 
   .*\b                                     # any 0+ chars other than linebreak chars, as many as possible 
)''' 
 
for m in re.findall(rx, s): 
    print(m) 

参见 Python demo .输出:

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 
Express Scripts Holding Company 
JPMorgan Chase & Co 
Boeing 
Bank of America Corporation 
Wells Fargo 
Cardinal Health 
Quid, Inc 
Endurance International Group 
Iflexion 
Mobikasa 2019 
arcadia 
Power Tools LLC 
ComputerEase Construction Software 
3M