正则表达式仅捕获字符串的特定部分

时间:2019-04-27 18:01:42

标签: python regex

是否有通用的正则表达式仅捕获公司名称?

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 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式,

[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']

编辑: 正如Chyngyz Akmatov提出的,如果名称可以包含数字,并且通常包含任何符号,则该正则表达式将正确获得名称,前提是公司名称以年份部分开头并加下划线。

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

Demo handling any character in company name

答案 1 :(得分:0)

您可以使用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']

答案 2 :(得分:0)

您也可以使用此正则表达式:

_\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

答案 3 :(得分:0)

假设只有普通字母,并且名称是每行的结尾:

grep -o '[A-Za-z][A-Za-z_]*$' names