我有一个字符串列表,像这样:
m = ['First Officer', 'Executive Officer']
还有像这样的Pandas数据框:
d = {'match': ['and', 'first'], 'use': ['&', '1st']}
df = pd.DataFrame(data=d)
我想为re.search
中的每个子字符串m
中的每个字符串df.match
,并在存在匹配项时,附加{{的re.sub
} 1}}和m[i]
分别用于df.match[i]
至df.use[i]
。
预期输出为:
m
最快的实现是什么?
答案 0 :(得分:0)
创建一个帮助函数来处理替换:
def helper(mtch):
return df.loc[df.match.eq(mtch.group().lower()), 'use'].values[0]
然后对 re.sub
使用列表推导:
[
re.sub(r'|'.join(df.match.values), lambda x: helper(x), i, flags=re.I)
for i in m
]
# ['1st Officer', 'Executive Officer']
如果您真的也想要原件:
set(m + [re.sub(r'|'.join(df.match.values), lambda x: helper(x), i, flags=re.I) for i in m])
# {'1st Officer', 'Executive Officer', 'First Officer'}
我个人认为,通过使用字典而不是数据框来完成此操作会更容易,这可以使查找更加容易:
dct = dict(df.values)
# {'and': '&', 'first': '1st'}
[
re.sub(r'|'.join(dct.keys()),
lambda x: dct[x.group().lower()], i, flags=re.I)
for i in m
]
# ['1st Officer', 'Executive Officer']