#python #regex
Вопрос:
Я хочу определять названия компаний с помощью регулярных выражений с помощью Python.
Это моя идея:
- Название компании должно содержать от 1 до 3 слов
- Первое слово в названии компании должно быть написано с заглавной буквы
- Одно из слов в названии компании может содержать .com или .co (Amazon.com Вкл.)
- Последнее слово названия компании (четвертое слово) должно быть Inc. , Ltd, GmbH, AG, GmbH, Группа, Холдинг и т.д.
- Между последним словом имени и 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
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. пожалуйста, проверьте тип регулярного выражения, которое я использовал для обнаружения улиц, можете ли вы повторить что-то подобное для названий компаний?