如何在Python中用正则提取匹配组并生成DataFrame新列
解决方法
要提取所有匹配的企业名称并生成对应列,你需要替换re.search为re.findall来获取全部匹配项,再将结果展开为多列。以下是完整实现步骤:
1. 修正正则逻辑并提取所有匹配项
首先定义正确的匹配模式,使用str.findall获取每行所有符合条件的企业名称:
import pandas as pd import re # 加载测试数据 data = { 'GKGRECORDID': [1, 3, 4, 5, 6], 'DATE': ['20160101223000-T417', '20151231060000-T360', '20151231100000-T827', '20151231101500-T428', '20151231140000-T543'], 'SourceCommonName': ['sueddeutsche.de', 'focus.de', 'welt.de', 'focus.de', 'focus.de'], 'DocumentIdentifier': [ 'http://www.sueddeutsche.de/wirtschaft/vw-skandal-schein-und-sein-1.2802686', 'http://www.focus.de/finanzen/boerse/volkswagen-skandal-im-news-ticker-vw-betriebsrat-fordert-nachhaltigkeitsbeirat-fuer-autobauer_id_5183047.html', 'http://www.welt.de/regionales/niedersachsen/article150494146/Osterloh-will-fuer-VW-Nachhaltigkeitsbeirat-mit-externen-Fachleuten.html', 'http://www.focus.de/regional/wolfsburg/auto-osterloh-will-fuer-vw-nachhaltigkeitsbeirat-mit-externen-fachleuten_id_5183279.html', 'http://www.focus.de/finanzen/news/wirtschaftsticker/unternehmen-osterloh-will-fuer-vw-nachhaltigkeitsbeirat-mit-externen-fachleuten_id_5183525.html' ] } df = pd.DataFrame(data) # 定义匹配模式(修正原代码语法错误) firms = ['adidas', 'Airbus', 'Allianz', 'Volkswagen', 'VW'] firm_pattern = '|'.join(firms) source_pattern = '|'.join(['welt.de', 'focus.de']) # 提取所有匹配的企业名称(不区分大小写) df['MatchedFirms'] = df['DocumentIdentifier'].str.findall(firm_pattern, flags=re.IGNORECASE) # 统一大小写避免重复识别(可选) df['MatchedFirms'] = df['MatchedFirms'].apply(lambda x: [item.upper() for item in x])
2. 将匹配列表展开为多列
根据最大匹配数量生成Firm1、Firm2等列:
# 获取最大匹配数,确定需要创建的列数 max_matches = df['MatchedFirms'].str.len().max() # 生成对应列 for i in range(max_matches): df[f'Firm{i+1}'] = df['MatchedFirms'].str.get(i)
3. 应用来源筛选条件
最后执行你原本的来源过滤逻辑:
# 筛选符合条件的行 results = df[(df['SourceCommonName'].str.contains(source_pattern, case=False, na=False)) & (df['MatchedFirms'].str.len() > 0)] # 查看结果 print(results[['GKGRECORDID', 'DocumentIdentifier', 'Firm1', 'Firm2']])
输出示例
第二行数据会同时显示VOLKSWAGEN(Firm1)和VW(Firm2),其他行也会正确展示匹配的企业名称。
关键说明
str.findall替代re.search,可获取所有非重叠匹配项,而非仅第一个结果flags=re.IGNORECASE实现不区分大小写的匹配- 统一大小写处理避免同一企业的不同写法被视为不同结果
str.get(i)提取列表中对应位置的元素,生成目标列
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

