Python 从docx中提取文本作为给定属性错误的键值对
我有一个docx文件,看起来像这样Python 从docx中提取文本作为给定属性错误的键值对,python,regex,docx,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):
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'
>属性错误
中的回溯(最近一次呼叫)
> 82
> 83
>-->84将文档转换为文本(文件路径=(r'data\u extraction.docx'))
>
>在将文档转换为文本(文件路径)中
> 51
>52作业位置=作业位置。搜索(文本)
>-->53 key\u value1=job\u location.group()
>54 split1=重新拆分(“:|-”,键值1)
>55个键。追加(拆分1[0])
>
>AttributeError:“非类型”对象没有属性“组”
为什么它不起作用?感谢您的帮助。谢谢当您收到此代码时,应该可以使用 编辑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+?)'
flags=re.MULTILINE
的情况下,^
字符将只匹配字符串的开头,而不是行的开头Job?
匹配Jo
可选择后跟ab
flags=re.DOTALL
,*
将贪婪地匹配任何非换行符0次或更多次\S+?
将可选地匹配1个或多个非空白字符Joabcdefg
与*
匹配abcdef
和\S+?
匹配g
您还可以调用匹配
对象的组
方法。但您必须向该方法传递一个整数,指定您感兴趣的组号
以下示例中给出了搜索作业位置所需的正则表达式:
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\u location\u re
,而不是对正则表达式和位置名称使用名称job\u location
(?^Job\s+位置:\s+
匹配作业位置:
,在作业
和位置:
之间以及位置:
之后允许一个或多个空格。这是在非捕获组中完成的(.*)
贪婪地匹配任何直到行尾的非换行符。这将是第1组$
与行尾匹配该错误表明
job\u location=job\u location.search(text)
未返回匹配项。但我使用regex刺激器创建了该regex,然后它又恢复了工作。我分别对其进行了处理,工作正常。不知道当我使用调试模式加入ittry时出了什么问题,或者像这样更改代码:job_location=job_location.findall(text)print(job_location)如果数组为空,则需要使用编译和/或文本提取它返回了一些empyt数组和作业位置。是因为它抛出了空数组错误吗?我怎样才能摆脱它呢?是的,错误是在搜索时,代码什么也找不到(有点理论):findall返回字符串中的所有条目,search只是第一个,建议使用findall,因为它更通用,并取代search。只需参考数组的第一个元素:job_location=job_location.findall(text)[0]job_location=job_location.search(text)和notice_period.group()尝试使用第一个条目(不是-None)并得到一个错误,因为无法使用空空间。您应该注意job_location=re.compile和text,有些方法不正确