You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:10:07