从docx中提取文本作为键值对,导致属性错误

时间:2019-11-14 11:06:03

标签: python regex docx

我有一个看起来像这样的docx文件

Requisition No: VOI9053459-
 
Job location: Melbourn
 
Exp : 2 – 4 Years
 
Notice period :-15day or less

,其中包含其他详细信息。我想从文档中提取某些键值对,并将其另存为字典。该文档已被提取并分配给

    for child in parent_elm.iterchildren():
        if isinstance(child, CT_P):
            yield Paragraph(child, parent)
    text=block.text

我到目前为止的进展是

        job_location=re.compile(r'(^Job?.*\S+?)')
        notice_period=re.compile(r'(^Notice?.*\d\w*.+\S+?)')
        experience=re.compile(r'(^Exp.*\S+?)')

        job_location=job_location.search(text)
        key_value1=job_location.group()
        split1=re.split(': |-',key_value1)
        keys.append(split1[0])
        data.append(split1[1])

        notice_period=notice_period.search(text)
        key_value2=notice_period.group()
        split2=re.split(': |-',key_value2)
        keys.append(split2[0])
        data.append(split2[1])

        experience=experience.search(text)
        key_value3=experience.group()
        split3=re.split(': |-',key_value3)
        keys.append(split3[0])
        data.append(split3[1])


        for key in keys:
            col.append((key,[]))
        i=0
        for j in range(len(data)):
            T=data[j]

            col[i][1].append(T)
            i+=1
        Dict={keys:data for (keys,data) in col}

        print(Dict)

我遇到属性错误

> AttributeError                            
Traceback (most recent call last) <ipython-input-261-84c60112ddb2> in <module>
>      82 
>      83 
> ---> 84 convert_docx_to_text(file_path=(r'data_extraction.docx'))
> 
> <ipython-input-261-84c60112ddb2> in convert_docx_to_text(file_path)
>      51 
>      52             job_location=job_location.search(text)
> ---> 53             key_value1=job_location.group()
>      54             split1=re.split(': |-',key_value1)
>      55             keys.append(split1[0])
> 
> AttributeError: 'NoneType' object has no attribute 'group'

为什么不起作用?任何帮助表示赞赏。谢谢

3 个答案:

答案 0 :(得分:1)

您的正则表达式有几个问题。让我们以正则表达式搜索工作位置。你有:

r'(^Job?.*\S+?)'
  1. 首先,在不使用flags=re.MULTILINE的情况下,^字符将仅匹配字符串的开头而不是行的开头。
  2. Job?匹配Jo ,后跟b
  3. 在缺少flags=re.DOTALL的情况下,.*贪婪地匹配任何个非换行字符0次或更多次。
  4. \S+?将有选择地匹配1个或多个非空格字符。

例如,您的正则表达式将与以下行匹配:Joabcdefg,其中.*匹配abcdef,而\S+?匹配g

您还可以调用group对象的match方法。但是您必须将一个整数传递给此方法,以指定您感兴趣的组号。

在下面的示例中给出了搜索工作位置所需的正则表达式:

import re

text = """=Requisition No: VOI9053459-

Job location: Melbourn

Exp : 2 – 4 Years

Notice period :-15day or less"""

job_location_re = re.compile(r'(?:^Job\s+location:\s+)(.*)$', re.MULTILINE)
m = job_location_re.search(text)
if m: # there is a match
    job_location = m.group(1)
    print(job_location)

打印:

Melbourn

请注意,我已将已编译的正则表达式称为job_location_re,而不是将正则表达式和位置名称都使用名称job_location

  1. (?^Job\s+location:\s+)在行的开头匹配Job location:,在Joblocation:之间以及location:之后允许一个或多个空格。这是在不捕获组中完成的。
  2. (.*)匹配贪婪直到行尾的所有非换行符。这将是第1组。
  3. $与行尾匹配。

答案 1 :(得分:0)

获得此代码后,它应该可以工作

编辑1改进代码,仅拆分第一个巧合

split3=re.split(': |-',key_value3, 1)
#keys.append(split3[0])
#data.append(split3[1])
k,v = split3
your_dict[k] = v

答案 2 :(得分:0)

注意这一行job_location = job_location.search(文本),搜索失败,因为job_location = None,因此发生错误,您将无法从None中获取任何信息,您要么需要更改“ text” ”或使用job_location