我有一个看起来像这样的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'
为什么不起作用?任何帮助表示赞赏。谢谢
答案 0 :(得分:1)
您的正则表达式有几个问题。让我们以正则表达式搜索工作位置。你有:
r'(^Job?.*\S+?)'
flags=re.MULTILINE
的情况下,^
字符将仅匹配字符串的开头而不是行的开头。Job?
匹配Jo
,后跟b
。flags=re.DOTALL
的情况下,.*
将贪婪地匹配任何个非换行字符0次或更多次。\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
。
(?^Job\s+location:\s+)
在行的开头匹配Job location:
,在Job
和location:
之间以及location:
之后允许一个或多个空格。这是在不捕获组中完成的。(.*)
匹配贪婪直到行尾的所有非换行符。这将是第1组。$
与行尾匹配。答案 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