Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从docx中提取文本作为给定属性错误的键值对_Python_Regex_Docx - Fatal编程技术网

Python 从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):

我有一个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'
>属性错误
中的回溯(最近一次呼叫)
>      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
    可选择后跟a
    b
  • 如果没有
    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,有些方法不正确