提问人:Mostafa Bouzari 提问时间:9/6/2023 最后编辑:wjandreaMostafa Bouzari 更新时间:9/6/2023 访问量:46
如何在正则表达式 Python 中获取匹配的组并将其另存为新列
How to get the matched groups in regex Python and save it as a new column
问:
我有一个数据帧,我想知道,是否有人在列中提到了我正在寻找的公司。可能它应该通过正则表达式组来完成,但我不确定,目前我使用 .DocumentIdentifier
contains()
数据如下所示:
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))]
我想要的是找出它匹配的哪些公司,并根据需要创建新列,例如新列中的第一行,例如应该写.对于列中的第二行和 .Firm1
vw
Firm1
vw
Firm2
Volkswagen
我发现我可以使用方法获取组。.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)
答:
0赞
Mostafa Bouzari
9/6/2023
#1
我找到了答案。该方法是很好的选择。 返回找到的变量的元组,然后可以将这些变量放入一个列表中(忽略空字符串),这很方便。re.findall
findall
我的代码:
[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)')
评论