如何在pandas列中匹配指定字符串并返回其后跟随的内容?
批量提取推特简介中Ins账号的实现方案
针对简介中格式不统一的关键词匹配场景,正则匹配是适配性最高的方案,可以覆盖带不同分隔符、不同关键词变体的内容,不需要逐行写分支判断。
匹配规则设计
结合提供的样本数据,需要覆盖的匹配场景包括:
- 关键词变体:
insta:、instagram:、ig:// - 关键词与账号间的分隔符:冒号、横杠、斜杠、空格
- 账号前缀:可选的
@符号
最终用非捕获组匹配触发关键词、灵活适配分隔符,通过捕获组抓取符合Ins账号规则的内容,避免提取到后续的无关文本。
完整代码实现
import pandas as pd import re # 构造和样本一致的测试DataFrame bio_df = pd.DataFrame({ "tweet_bio": [ 'lad who loves to cook 🥘 • insta: xxx', 'founder and head chef | insta: xxx |', '🇬🇧 |bakery instagram - xxx', 'insta: @xxx for enquiries', 'self taught baker. ig:// xxxx 🍥🧆' ] }) # 定义提取正则 # 正则说明: # (?:insta|instagram|ig):非捕获组匹配所有Ins相关的触发关键词,不纳入提取结果 # \s*[:\/-]?\s*:匹配关键词后任意空格、冒号、斜杠、横杠分隔符 # @?:匹配账号前可选的@符号,不纳入提取结果 # ([A-Za-z0-9_.]+):捕获组匹配符合Ins账号规则的连续字符(字母、数字、下划线、点) extract_pattern = r'(?:insta|instagram|ig)\s*[:\/-]?\s*@?([A-Za-z0-9_.]+)' # 批量执行提取,IGNORECASE参数适配大小写混写的场景,比如INSTA:、Instagram: bio_df["extracted_ins"] = bio_df["tweet_bio"].str.extract(extract_pattern, flags=re.IGNORECASE)
效果说明
针对提供的5条测试样本,最终提取结果为:
- 第1行:
xxx - 第2行:
xxx - 第3行:
xxx - 第4行:
xxx(自动跳过前缀的@符号) - 第5行:
xxxx
可自定义调整项
- 如果需要保留账号前的@符号,只需将捕获组调整为
(@?[A-Za-z0-9_.]+)即可 - 如果后续碰到新的分隔符(比如关键词后面跟竖线
|),只需将对应符号加入正则的分隔符匹配组[:\/-]中 - 对于完全没有匹配到的行,提取结果会自动返回空值,不会报错
内容的提问来源于stack exchange,提问作者Jimmy K
相关产品推荐
相关产品推荐

