用于关键字列表的Python Replace()

2024-05-29 07:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份公司名单,上面有他们的名字+商业首字母缩略词,例如:

['Abc Inc','def Gmbh','ghi PLC', 'xhlm SA', 'sojs LLC'] and so on. 

我想得到一份没有PLC,INC,Gmbh和所有类似首字母缩略词的清晰清单。出于这个原因,我添加了一个For循环,该循环遍历了一个首字母缩略词列表,以将它们从公司名称中删除并替换为“”

这就是我带来的,但是极大地增加了处理代码所需的时间。还有更好的主意吗

def ExtractNames():

substring_adjustment = ['AB', 'AB', 'B.V', 'B.v', 'BV', 'BV', 'GMBH', 'Gmbh', 'INC', 'INC.', 'Inc', 'Inc.', 'LTD', 'Ltd', 'NV', 'NV', 'P.L.C', 'P.L.C', 'PLC', 'Plc', 'SA', 'SE', 'SE', 'SPA', 'Sa', 'Spa', 'ab', 'b.v', 'bv', 'gmbh', 'inc', 'inc.', 'ltd', 'nv', 'p.l.c', 'plc', 'sa', 'se', 'spa',",",".","-"]  
Company_List= load_workbook(filename='Excel for Scraping.xlsx',data_only=True).active 

for row in Company_List.iter_rows (min_row=2,min_col=1,max_col=1,values_only=True): 
    value = row[0]
    for word in substr_adjust:
        value = value.replace(word,"")
        print(value)

Tags: forabvaluedefsa公司incplc
3条回答

您可以创建一组子字符串,并在公司名称中的单词上循环,测试它们是否列出,然后将它们连接在一起,而不是在值中可能存在的所有子字符串上循环(然后使用replace,这有潜在的其他问题,例如,如果公司名称中的单词包含“ab”作为子字符串)(使用空格分隔符)那些不是。集合包含测试是O(1)倍,所以它不应该这么慢

substring_adjustment = {'AB', 'AB', 'B.V', 'B.v', 'BV', 'BV', 'GMBH', 'Gmbh', 'INC', 'INC.', 'Inc', 'Inc.', 'LTD', 'Ltd', 'NV', 'NV', 'P.L.C', 'P.L.C', 'PLC', 'Plc', 'SA', 'SE', 'SE', 'SPA', 'Sa', 'Spa', 'ab', 'b.v', 'bv', 'gmbh', 'inc', 'inc.', 'ltd', 'nv', 'p.l.c', 'plc', 'sa', 'se', 'spa',",",".","-"}


for value in ['Abc Inc','def Gmbh','ghi PLC', 'xhlm SA', 'sojs LLC']:

    print(' '.join(word for word in value.split()
                   if word not in substring_adjustment))

给出:

Abc
def
ghi
xhlm
sojs LLC

还请注意substring_adjustment的表达式实际上有一些重复项(例如'AB''BV'),但这些项将在创建集合时自动处理

使用正则表达式,您可能可以更快地完成此操作:

import re

def ExtractNames():
    substring_adjustment = ['AB', 'AB', 'B.V', 'B.v', 'BV', 'BV', 'GMBH', 'Gmbh', 'INC', 'INC.', 'Inc', 'Inc.', 'LTD', 'Ltd', 'NV', 'NV', 'P.L.C', 'P.L.C', 'PLC', 'Plc', 'SA', 'SE', 'SE', 'SPA', 'Sa', 'Spa', 'ab', 'b.v', 'bv', 'gmbh', 'inc', 'inc.', 'ltd', 'nv', 'p.l.c', 'plc', 'sa', 'se', 'spa',",",".","-"]  
    removal_regex = '|'.join(re.escape(word) for word in substring_adjustment)
    # 'AB|AB|B\\.V|B\\.v|BV|BV|...'
    for row in Company_List.iter_rows(min_row=2, min_col=1, max_col=1, values_only=True):
        value = re.sub(removal_regex, '', row[0])

您可以加入替换并使用正则表达式:

import re
substring_adjustment = ['AB', 'AB', 'B.V', 'B.v', 'BV', 'BV', 'GMBH', 'Gmbh', 'INC', 'INC.', 'Inc', 'Inc.', 'LTD', 'Ltd', 'NV', 'NV', 'P.L.C', 'P.L.C', 'PLC', 'Plc', 'SA', 'SE', 'SE', 'SPA', 'Sa', 'Spa', 'ab', 'b.v', 'bv', 'gmbh', 'inc', 'inc.', 'ltd', 'nv', 'p.l.c', 'plc', 'sa', 'se', 'spa',",",".","-"]
lst = ['Abc Inc','def Gmbh','ghi PLC', 'xhlm SA', 'sojs LLC']

rx = re.compile(r'\s*(?:{})$'.format("|".join(substring_adjustment)))

new_list = [rx.sub('', item) for item in lst]
print(new_list)
# ['Abc', 'def', 'ghi', 'xhlm', 'sojs LL']

正如您所看到的,这种方法的问题在于,您需要首先进行较长的替换。此外,替换列表中还有重复项。
也就是说,您可以将替换列表和正则表达式更改为:

import re

substring_adjustment = ['AB', 'B\.?V', 'GMBH', 'INC\.?', 'LTD', 'NV', 'P\.?L\.?C', 'S[AE]', 'SPA']
lst = ['Abc Inc', 'def Gmbh', 'ghi PLC', 'xhlm SA', 'sojs LLC', 'XXX Management Limited']

rx = re.compile(r'(?i)\s*\b(?:{})$'.format("|".join(substring_adjustment)))

new_list = [rx.sub('', item) for item in lst]
print(new_list)

对于您的示例,这将产生:

['Abc', 'def', 'ghi', 'xhlm', 'sojs LLC', 'XXX Management Limited']

相关问题 更多 >

    热门问题