Regex, чтобы соответствовать названиям компаний из заявлений об авторских правах при нескольких условиях - PullRequest
2 голосов
/ 20 марта 2019

У меня плотный график, чтобы придумать регулярное выражение на 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'

Какой-нибудь совет для хорошего регулярного выражения для этого?

1 Ответ

3 голосов
/ 20 марта 2019

Вы можете рассмотреть регулярные выражения, например

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

См. Демонстрационную версию регулярных выражений .Используйте модификатор без учета регистра, re.I с ним.

Подробности

  • (?:©(?:\s*Copyright)?|Copyright(?:\s*©)?) - либо
    • ©(?:\s*Copyright)? - © char, за которыми следует необязательная подстрока из 0+ пробелов, а затем Copyright
    • | - или
    • Copyright(?:\s*©)? - Copyright, за которой следует необязательная подстрока из 0+ пробелови © char
  • \s* - 0+ пробелов
  • \d+ - 1+ цифр (используйте \d{4}, если годы всегда содержат 4 цифры)
  • (?:\s*-\s*\d+)? - необязательная последовательность -, заключенная в 0+ пробелов и затем 1+ цифр (используйте \d{4}, если годы всегда содержат 4 цифры)
  • \s*- 0+ пробелов
  • (.*?(?=\W*All\s+rights\s+reserved)|[^.]*(?=\.)|.*) - Группа захвата 1 : любая из альтернатив:
    • .*?(?=\W*All\s+rights\s+reserved) - любые 0+ символов, кроме символов разрыва строки, скак можно меньше, до 0+ несловарных символов, за которыми следует All rights reserved string
    • [^.]*(?=\.) - любые 0+ символов, кроме ., максимально возможное количество до ., не включая .
    • .* - остаток строки

Демо 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."
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...