Regex, чтобы поймать только определенную часть строки - PullRequest
0 голосов
/ 27 апреля 2019

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

Q4_2017_American_Airlines_Group_Inc
Q1_2016_Apple_Inc
Q4_2014_Alcoa_Inc
Q3_2015_Arconic_Inc
Q3_2017_Orkla_ASA
Q2_2018_AGCO_Corp
Quarter_3_2018_Autodesk_Inc
Q4_2018_Control4_Corp

Вывод должен быть:

American_Airlines_Group_Inc
Apple_Inc
Alcoa_Inc
Arconic_Inc
Orkla_ASA
AGCO_Corp
Autodesk_Inc

Примечание: Название компании может содержать символы или цифры

Ответы [ 4 ]

2 голосов
/ 27 апреля 2019

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

[a-zA-Z]+(?:_[a-zA-Z]+)*$

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

Здесь [a-zA-Z]+ начинает сопоставлять алфавитные названия компаний, а (?:_[a-zA-Z]+)* далее сопоставляет любые алфавитные слова с дефисом перед ними, а $ обеспечивает совпадение совпадающей строки со строкой.

Regex Demo

код Python,

import re

arr = ['Q4_2017_American_Airlines_Group_Inc','Q1_2016_Apple_Inc','Q4_2014_Alcoa_Inc','Q3_2015_Arconic_Inc','Q3_2017_Orkla_ASA','Q2_2018_AGCO_Corp','Quarter_3_2018_Autodesk_Inc']

for s in arr:
 m = re.search(r'[a-zA-Z]+(?:_[a-zA-Z]+)*$', s)
 print(s, '-->', m.group())

печать

Q4_2017_American_Airlines_Group_Inc --> American_Airlines_Group_Inc
Q1_2016_Apple_Inc --> Apple_Inc
Q4_2014_Alcoa_Inc --> Alcoa_Inc
Q3_2015_Arconic_Inc --> Arconic_Inc
Q3_2017_Orkla_ASA --> Orkla_ASA
Q2_2018_AGCO_Corp --> AGCO_Corp
Quarter_3_2018_Autodesk_Inc --> Autodesk_Inc

Кроме того, если у вас есть одна строка из названий этих компаний, вы можете использовать следующий код и использовать re.findall для отображения всех названий компаний,

import re

s = '''Q4_2017_American_Airlines_Group_Inc
Q1_2016_Apple_Inc
Q4_2014_Alcoa_Inc
Q3_2015_Arconic_Inc
Q3_2017_Orkla_ASA
Q2_2018_AGCO_Corp
Quarter_3_2018_Autodesk_Inc'''

print(re.findall(r'(?m)[a-zA-Z]+(?:_[a-zA-Z]+)*$', s))

печать

['American_Airlines_Group_Inc', 'Apple_Inc', 'Alcoa_Inc', 'Arconic_Inc', 'Orkla_ASA', 'AGCO_Corp', 'Autodesk_Inc']

Edit: Как подчеркнул Чингиз Акматов, если имя может содержать цифры и вообще любой символ, то это регулярное выражение получит имя правильно, что предполагает, что название компании начинается после части года и подчеркивания.

(?<=\d{4}_).*$

Демонстрация обработки любого символа в названии компании

0 голосов
/ 27 апреля 2019

При условии, что есть только нормальные буквы и имена являются концом каждой строки:

grep -o '[A-Za-z][A-Za-z_]*$' names
0 голосов
/ 27 апреля 2019

Вы также можете использовать это регулярное выражение:

_\d+(?:_\d+)*_(.*)

Код

import re

lst = ['Q4_2017_American_Airlines_Group_Inc', 'Q1_2016_Apple_Inc', 'Q4_2014_Alcoa_Inc', 'Q3_2015_Arconic_Inc', 'Q3_2017_Orkla_ASA', 'Q2_2018_AGCO_Corp', 'Quarter_3_2018_Autodesk_Inc']

for x in lst:
    print(re.search(r'_\d+(?:_\d+)*_(.*)', x).group(1))

# American_Airlines_Group_Inc
# Apple_Inc                                                   
# Alcoa_Inc                                                   
# Arconic_Inc                                                 
# Orkla_ASA                                                   
# AGCO_Corp                                                    
# Autodesk_Inc
0 голосов
/ 27 апреля 2019

Вы можете использовать re.sub:

import re
data = [re.sub('\w+\d{4}_', '', i) for i in filter(None, content.split('\n'))]

Выход:

['American_Airlines_Group_Inc', 'Apple_Inc', 'Alcoa_Inc', 'Arconic_Inc', 'Orkla_ASA', 'AGCO_Corp', 'Autodesk_Inc']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...