Python 如何从对象数据类型中提取特定的单词/数值?

Python 如何从对象数据类型中提取特定的单词/数值?,python,regex,python-3.x,pandas,Python,Regex,Python 3.x,Pandas,我正在尝试使用python(无关)为我的公司自动化一些东西,这就是我的问题所在。 首先,我正在从邮箱中的特定文件夹创建数据帧。(在此之前没有问题) 范围索引:36个条目,0到35 数据列(共6列): #列非空计数数据类型 --- ------ -------------- ----- 0未命名:0 36非空int64 1日期36非空datetime64[ns] 2主题36非空对象 3.36非空对象 4 Body 36非空对象 5 OpportunityID

我正在尝试使用python(无关)为我的公司自动化一些东西,这就是我的问题所在。 首先,我正在从邮箱中的特定文件夹创建数据帧。(在此之前没有问题)


范围索引:36个条目,0到35
数据列(共6列):
#列非空计数数据类型
---  ------         --------------  -----         
0未命名:0 36非空int64
1日期36非空datetime64[ns]
2主题36非空对象
3.36非空对象
4 Body 36非空对象
5 OpportunityID 36非空对象
数据类型:datetime64[ns](1)、int64(1)、object(4)
内存使用率:1.8+KB
正文栏包含电子邮件线索(很长);但所有这些线索都包含我关心的两条基本信息:

  • 每个电子邮件正文都包含一个“Opportunity ID:12345678(正好8个字母长度)”

  • 下列选项中的一个词:
    Won/Won/Lost/Lost/Active/Active/Hold/Hold

  • 我希望能够将这两条信息从Body列提取到两个单独的列中

    无论我怎么做,Body列都不会转换为字符串。此外,我还尝试了正则表达式、str.split、extract、re、utf-8编码。 似乎什么都不起作用。使用
    re.findall(r“\d+”,df.Body)
    给出:
    TypeError:预期的字符串或字节,如对象

    主体柱示例: 亲爱的XX:

    不幸的是,我们已经失去了这个

    致意

    XXX

    发件人:XXXX 发送日期:2020年4月15日星期三下午4:46 收件人:XXX 抄送:XXX 主题:提醒更新X

    我们正在清理管道,请您提供以下opportunity的状态更新

    请说明它是活动的/赢的/丢失的还是取消的

    详情如下:

    • 商机ID:12345678

    • 客户名称:X

    • 机会描述:X

    • 业务合伙人:X

    • 业务经理:X

    • 总费用:1033000

    • 总费用(百万美元):

    如果您有任何顾虑,请告诉我。 X

    您可以使用

    df['Opportunity_ID']=df['Body'].str.extract(r'Opportunity\s+ID\s*:\s*(\d{8})') 
    df['Keyword']=df['Body'].str.extract(r'(?i)\b(won|lost|active|hold)\b')
    
    第一个
    Opportunity\s+ID\s*:\s*(\d{8})regex匹配
    Opportunity
    、一个或多个空格(带
    \s+
    )、一个
    ID
    子字符串、一个包含0+空格字符的冒号(请参见
    \s*:\s*
    ),然后将任意八位数字捕获到组1中(请参见
    (\d{8})


    r'(?i)\b(won | lost | active | hold)\b'
    模式只匹配捕获组中的四个备选方案中的任何一个(在
    交替操作符的帮助下连接),以不区分大小写的方式作为整个单词(
    \b
    是单词边界)(请参见
    (?i)
    修饰符).

    主体值的类型是什么?它们是JSON字符串还是仅字符串?如果它们是长字符串,您能否提供一个示例(或一些示例),我们目前不知道在不知道值的情况下如何进行解析。好的,请尝试
    df['Opportunity\u ID']=df['Body'].str.extract(r'Opportunity\s+ID\s*:\s*(\d{8})
    df['Keyword']=df['Body'].str.extract(r'(?i)\b(won | lost | active | hold)\b')
    和print
    df
    添加了Body列的描述非常感谢!在过去的6个小时里一直在与re抗争!!
    df['Opportunity_ID']=df['Body'].str.extract(r'Opportunity\s+ID\s*:\s*(\d{8})') 
    df['Keyword']=df['Body'].str.extract(r'(?i)\b(won|lost|active|hold)\b')