从 docx 中提取文本作为键值对给出属性错误

Extracting text from docx as key value pair giving attribute error

我有一个如下所示的 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'

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

当您获得此代码时,应该可以使用

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

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

注意这一行job_location = job_location.search(text),搜索不成功,因为job_location = None,因此出现错误,你不会从None得到任何东西,你要么需要更改 text 或使用 job_location

您的正则表达式有几个问题。让我们使用正则表达式来搜索工作地点。你有:

r'(^Job?.*\S+?)'
  1. 首先,如果不使用 flags=re.MULTILINE^ 字符将只匹配字符串的开头,而不是一行的开头。
  2. Job? 匹配 Jo (可选) 后跟 b.
  3. 在没有flags=re.DOTALL的情况下,.*贪心匹配任何非换行符0或更多次。
  4. \S+? 将有选择地匹配 1 个或多个非白色 space 字符。

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

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

搜索工作地点所需的正则表达式在以下示例中给出:

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: 之间以及 [=33= 之后的一个或多个 space ].这是在 非捕获 组中完成的。
  2. (.*) 匹配 greedily 直到行尾的任何非换行符。这将是第 1 组。
  3. $ 匹配行尾。