如何在Pandas中用带变量的正则表达式提取含指定姓名的语句
问题解决与代码修正
你的代码核心问题是正则表达式匹配逻辑错误,导致无法提取到包含姓名的完整语句。以下是具体分析和修正方案:
问题分析
- 你写的正则
fr'[^.]{x}[^.]'仅匹配姓名前后各一个非句号字符,而非包含姓名的完整句子。比如Brian在句尾时(紧跟句号),这个正则完全匹配不到,直接返回空列表。 - 提取目标语句的正确思路应该是:先把文本按句号拆分成独立句子,再筛选出包含目标姓名的句子。
修正后的完整代码
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)
代码说明
- 姓名匹配优化:改用
apply遍历每个单元格,提取所有匹配的姓名,避免原循环中后匹配的姓名覆盖先匹配结果的问题。 - 句子提取逻辑:
- 先将文本按句号拆分为句子列表,同时清理拆分后产生的空字符串和句子前后的多余空格。
- 遍历句子列表,筛选出包含任意目标姓名的句子,返回结果列表。
运行结果
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
相关产品推荐
相关产品推荐

