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

re.search匹配结果不完整求助:提取DataFrame完整描述文本

问题

我有一个包含多列文本的DataFrame,尝试在Text列中使用带通配符的正则表达式搜索子串,并将结果存入新列。目前能匹配到结果,但返回的不是完整字符串。

示例代码如下:

import pandas as pd
import re

df = pd.DataFrame(
    {
        'Col1': ['Some data 1', 'Some data 2', 'Some data 3'],
        'Col2': ['More data 1', 'More data 2', 'More data 3'],
        'Text': ['ID:12345;Description: This is a long piece of text containting some information I want to search for;Status=off;',
                    'Description: This is a another long piece of text containting some different information I want to search for;ID:abcde;Status=on;',
                    'Status=unknown;ID:abcde;Description: And this is a third piece of long piece of text which I want to search for;']
    }
)

尝试的代码:

df['Description'] = df['Text'].apply(lambda x: re.search('Description: (.*?);',x))

得到的结果中,re.Match对象的匹配内容被截断,并非完整的描述文本,请问哪里操作错误?


解决方法

你的问题有两个核心原因:

  • 未提取匹配到的实际内容:re.search()返回的是Match对象,不是直接的字符串结果。直接将这个对象存入DataFrame列,显示时只会展示对象的简略信息,而非捕获到的描述文本。必须调用.group(1)来提取正则表达式中括号捕获组的内容。
  • 冗余的非贪婪匹配(可选优化):虽然.*?能工作,但用[^;]*匹配所有非分号字符更高效,因为它不需要回溯,直接定位到下一个分号为止。

修正后的代码

简洁写法

df['Description'] = df['Text'].apply(
    lambda x: re.search(r'Description: ([^;]*);', x).group(1) if re.search(r'Description: ([^;]*);', x) else None
)

更高效的写法(避免重复调用正则)

def get_description(text):
    match_result = re.search(r'Description: ([^;]*);', text)
    return match_result.group(1) if match_result else None

df['Description'] = df['Text'].apply(get_description)

运行后,df['Description']列将完整存储提取出的描述文本,不会出现截断问题。如果文本中不存在Description:字段,该列会填充None,避免报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:37:16