Регулярное выражение для определения названий компаний в Python

#python #regex

Вопрос:

Я хочу определять названия компаний с помощью регулярных выражений с помощью Python.

Это моя идея:

  1. Название компании должно содержать от 1 до 3 слов
  2. Первое слово в названии компании должно быть написано с заглавной буквы
  3. Одно из слов в названии компании может содержать .com или .co (Amazon.com Вкл.)
  4. Последнее слово названия компании (четвертое слово) должно быть Inc. , Ltd, GmbH, AG, GmbH, Группа, Холдинг и т.д.
  5. Между последним словом имени и Inc. , Ltd, GmbH, AG иногда может быть», «или»,»

Я пробовал что-то подобное, но это не работает:

 address_1 = 'I work in Amazon.com Inc.'
address_2 = 'Company named Swiss Medic Holding invested in vaccine'
address_3 = 'what do you think about Abercrombie amp; Fitch Co. ?'
address_4 = 'do you work in Delta Group?'
address_5 = 'I have worked in CocaCola Gmbh'

regex_company = '([A-Z][w] [ -] ){1,3}(Ltd|ltd|LTD|llc|LLC|Inc|inc|INC|plc|Corp|Group)'
found = re.search(regex_company, address)
 

И я хочу распечатать результаты обнаруженных компаний
Я использовал ту же логику регулярных выражений для поиска адресов улиц, и это хорошо работает, но для названий компаний это не так.
Это регулярное выражение, которое я использовал:

 regex_street = "(d{0,6})(?:w)s([A-Z][w] [ -] ){1,3}(Street|St|Road|Rd)
 

Логика регулярных выражений: число 1-3 слова улица/улица/дорога/улица

Комментарии:

1. Это может быть слишком большим объемом возможностей для регулярных выражений. Существует ли потенциально другой способ получить название компании?

2. I want to и с какой проблемой вы сталкиваетесь ? Что такое «не работает» ?

3. Условие 3 затрудняет это, поскольку регулярные выражения не создаются для «только одного из». Можно ли сопоставлять шаблоны, в которых каждое слово заканчивается на .com / .co ?

4. @peer хорошо ответьте на это да и нет, у меня нет случая, когда у меня есть 2 или 3 имени слова только с одним .com, его только одно слово заканчивается на .com

Ответ №1:

Воспользуйся

 b[A-Z]w (?:.com?)?(?:[ -] (?:amp;[ -] )?[A-Z]w (?:.com?)?){0,2}[,s] (?i:ltd|llc|inc|plc|co(?:rp)?|group|holding|gmbh)b
 

См.Доказательство регулярного выражения.

объяснение

 --------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  [A-Z]                    any character of: 'A' to 'Z'
--------------------------------------------------------------------------------
  w                       word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    .                       '.'
--------------------------------------------------------------------------------
    co                       'co'
--------------------------------------------------------------------------------
    m?                       'm' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (between 0 and 2
                           times (matching the most amount
                           possible)):
--------------------------------------------------------------------------------
    [ -]                     any character of: ' ', '-' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (optional
                             (matching the most amount possible)):
--------------------------------------------------------------------------------
      amp;                        'amp;'
--------------------------------------------------------------------------------
      [ -]                     any character of: ' ', '-' (1 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )?                       end of grouping
--------------------------------------------------------------------------------
    [A-Z]                    any character of: 'A' to 'Z'
--------------------------------------------------------------------------------
    w                       word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (optional
                             (matching the most amount possible)):
--------------------------------------------------------------------------------
      .                       '.'
--------------------------------------------------------------------------------
      co                       'co'
--------------------------------------------------------------------------------
      m?                       'm' (optional (matching the most
                               amount possible))
--------------------------------------------------------------------------------
    )?                       end of grouping
--------------------------------------------------------------------------------
  ){0,2}                   end of grouping
--------------------------------------------------------------------------------
  [,s]                    any character of: ',', whitespace (n, r,
                           t, f, and " ") (1 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  (?i:                     group, but do not capture (case-
                           insensitive) (with ^ and $ matching
                           normally) (with . not matching n)
                           (matching whitespace and # normally):
--------------------------------------------------------------------------------
    ltd                      'ltd'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    llc                      'llc'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    inc                      'inc'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    plc                      'plc'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    co                       'co'
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (optional
                             (matching the most amount possible)):
--------------------------------------------------------------------------------
      rp                       'rp'
--------------------------------------------------------------------------------
    )?                       end of grouping
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    group                    'group'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    holding                  'holding'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    gmbh                     'gmbh'
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
 

Код на Python:

 import re

regex = r"b[A-Z]w (?:.com?)?(?:[ -] (?:amp;[ -] )?[A-Z]w (?:.com?)?){0,2}[,s] (?i:ltd|llc|inc|plc|co(?:rp)?|group|holding|gmbh)b"

test_str = ("I work in Amazon.com Inc.n"
    "Company named Swiss Medic Holding invested in vaccinen"
    "what do you think about Abercrombie amp; Fitch Co. ?n"
    "do you work in Delta Group?n"
    "I have worked in CocaCola Gmbh")

print(re.findall(regex, test_str))
 

Результаты: ['Amazon.com Inc', 'Swiss Medic Holding', 'Abercrombie amp; Fitch Co', 'Delta Group', 'CocaCola Gmbh']

Комментарии:

1. Похоже, он работает неправильно, так как возвращает слова без заглавных букв (т. Е. Работа, имя, о…).

2. @JoanLaraGanau Нет, это работает нормально. Я предоставил код и результаты.

3. Теперь он отлично работает, потому что вы его отредактировали. В любом случае, хорошая работа, это довольно сложное регулярное выражение. Правка: возможно, вы добавили только r"

4. Но название компании должно содержать ltd, group, plc, холдинг и т.д. в его конце

5. @taga Именно то, что делает мое решение. Находит их в конце.

Ответ №2:

Использовать https://regex101.com для тестирования регулярных выражений это здорово. Для вашего конкретного примера вот регулярное выражение, которое делает то, что вы хотите. Я не вижу необходимости проверять наличие необязательного .com в этом примере.

 regex_company = '[A-Z]([^ ]*[ amp;]*){0,2}(Inc.|Ltd|GmbH|AG|Gmbh|Group|Holding|Co.)'

for address in [address_1, address_2, address_3, address_4, address_5]:
    found = re.search(regex_company, address)
    if found:
        print(found)

# prints:
# <regex.Match object; span=(10, 25), match='Amazon.com Inc.'>
# <regex.Match object; span=(14, 33), match='Swiss Medic Holding'>
# <regex.Match object; span=(24, 47), match='Abercrombie amp; Fitch Co.'>
# <regex.Match object; span=(15, 26), match='Delta Group'>
# <regex.Match object; span=(17, 30), match='CocaCola Gmbh'>

 

Комментарии:

1. пожалуйста, проверьте тип регулярного выражения, которое я использовал для обнаружения улиц, можете ли вы повторить что-то подобное для названий компаний?