如何在正则表达式 Python 中获取匹配的组并将其另存为新列

How to get the matched groups in regex Python and save it as a new column

提问人:Mostafa Bouzari 提问时间:9/6/2023 最后编辑:wjandreaMostafa Bouzari 更新时间:9/6/2023 访问量:46

问:

我有一个数据帧,我想知道,是否有人在列中提到了我正在寻找的公司。可能它应该通过正则表达式组来完成,但我不确定,目前我使用 .DocumentIdentifiercontains()

数据如下所示:

GKGRECORDID 日期 源通用名称 文档标识符
1 20160101223000-T417 sueddeutsche.de “http://www.sueddeutsche.de/wirtschaft/vw-skandal-schein-und-sein-1.2802686”
3 20151231060000-T360 focus.de “http://www.focus.de/finanzen/boerse/volkswagen-skandal-im-news-ticker-vw-betriebsrat-fordert-nachhaltigkeitsbeirat-fuer-autobauer_id_5183047.html”
4 20151231100000-T827 welt.de “http://www.welt.de/regionales/niedersachsen/article150494146/Osterloh-will-fuer-VW-Nachhaltigkeitsbeirat-mit-externen-Fachleuten.html”
5 20151231101500-T428 focus.de “http://www.focus.de/regional/wolfsburg/auto-osterloh-will-fuer-vw-nachhaltigkeitsbeirat-mit-externen-fachleuten_id_5183279.html”
6 20151231140000-T543 focus.de “http://www.focus.de/finanzen/news/wirtschaftsticker/unternehmen-osterloh-will-fuer-vw-nachhaltigkeitsbeirat-mit-externen-fachleuten_id_5183525.html”

使用正确过滤数据的方法,但我认为这不是正确的查找方法,它与哪家公司匹配。我的代码如下所示:contain()

firm_pattern='|'.join(['adidas', 'Airbus', 'Allianz','Volkswagen','VW')
pattern = '|'.join(['welt.de','focus.de'])
results=[results[(results['DocumentIdentifier'].str.contains(f'{firm_pattern}', case=False, na=False)) & 
                                         (results['SourceCommonName'].str.contains(pattern,case=False, na=False))]

我想要的是找出它匹配的哪些公司,并根据需要创建新列,例如新列中的第一行,例如应该写.对于列中的第二行和 .Firm1vwFirm1vwFirm2Volkswagen

我发现我可以使用方法获取组。.group()

re.search(r'(volkswagen)|(vw)', 
'http://www.focus.de/finanzen/boerse/volkswagen-skandal-im-news-ticker-vw-betriebsrat-fordert-nachhaltigkeitsbeirat-fuer-autobauer_id_5183047.html'
).group(0) #0-1 returns volkswagen only but it should return vw as well

如何改进我的代码?

编辑:

如果要使用我的数据,请复制以下代码:

import pandas as pd

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)


print(df)
python pandas 正则表达式 数据清理 字符串匹配

评论

0赞 wjandrea 9/6/2023
你做过任何研究吗?我在谷歌上搜索了你的问题标题,发现了这个,这看起来是一个很好的灵感: 从单列中的子字符串/正则表达式匹配创建多个新的数据帧列
0赞 wjandrea 9/6/2023
请简化为一个最小的可重复示例。如果其他列与问题无关,请不要包含它们。有关具体信息,请参阅如何制作良好的可重现熊猫示例。请完整显示所需的输出。

答:

0赞 Mostafa Bouzari 9/6/2023 #1

我找到了答案。该方法是很好的选择。 返回找到的变量的元组,然后可以将这些变量放入一个列表中(忽略空字符串),这很方便。re.findallfindall

我的代码:

[value for tpl in re.findall(r'(volkswagen)|(vw)|(BMW)', 
 'http://www.focus.de/finanzen/boerse/-bmw-volkswagen-skandal-im-news-ticker-vw-betriebsrat-fordert-nachhaltigkeitsbeirat-fuer-autobauer_id_5183047.html',
       re.IGNORECASE) for value in tpl if value != '']

result>> ['bmw', 'volkswagen', 'vw']

正如@wjandrea从另一篇文章中建议的那样,也可以有用:df.column.str.extract(regex expression)

#Make sure you use double brackets 
df[['1','2','3']]=df.DocumentIdentifier.str.extract(r'(volkswagen)|(vw)|(BMW)')