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

如何在Pandas中用带变量的正则表达式提取含指定姓名的语句

问题解决与代码修正

你的代码核心问题是正则表达式匹配逻辑错误,导致无法提取到包含姓名的完整语句。以下是具体分析和修正方案:

问题分析

  1. 你写的正则fr'[^.]{x}[^.]'仅匹配姓名前后各一个非句号字符,而非包含姓名的完整句子。比如Brian在句尾时(紧跟句号),这个正则完全匹配不到,直接返回空列表。
  2. 提取目标语句的正确思路应该是:先把文本按句号拆分成独立句子,再筛选出包含目标姓名的句子。

修正后的完整代码

import pandas as pd

df = pd.DataFrame({
    'ColumnA': ['Lorum ipsum. This is approved. Lorum Ipsum.', 'Lorum Ipsum. Send the contract to May. Lorum Ipsum.', 'Junk Mail from Brian.']
})

last_names_list = ['May','Brian']

# 优化姓名匹配:提取单元格中所有匹配的姓名(支持单个单元格多个姓名的场景)
df['last_names'] = df['ColumnA'].apply(lambda x: [name for name in last_names_list if name in x])

def extract_target_sentences(names, text):
    if not names:
        return []
    # 按句号拆分句子,清理空内容和前后空格
    sentences = [s.strip() for s in text.split('.') if s.strip()]
    # 筛选包含任意目标姓名的句子
    return [sent for sent in sentences if any(name in sent for name in names)]

# 生成目标列
df['col_3'] = df.apply(lambda x: extract_target_sentences(x['last_names'], x['ColumnA']), axis=1)

print(df)

代码说明

  1. 姓名匹配优化:改用apply遍历每个单元格,提取所有匹配的姓名,避免原循环中后匹配的姓名覆盖先匹配结果的问题。
  2. 句子提取逻辑:
    • 先将文本按句号拆分为句子列表,同时清理拆分后产生的空字符串和句子前后的多余空格。
    • 遍历句子列表,筛选出包含任意目标姓名的句子,返回结果列表。

运行结果

ColumnA last_names                     col_3
0  Lorum ipsum. This is approved. Lorum Ipsum.          []                           []
1  Lorum Ipsum. Send the contract to May. Lorum Ipsum.   [May]  [Send the contract to May]
2                          Junk Mail from Brian.        [Brian]        [Junk Mail from Brian]

内容的提问来源于stack exchange,提问作者oymonk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:59:55